java数组定义
java里面的数组有两种定义方式,java里面的任意数据类型都可以构造该类型的数组,这里就以String类型来举例说明。
String[] arr1;
String arr2[];
两种定义数组的方式区别在于"[]"的位置,这两种数组定义的方式是完全一样的,当然你如果在"[]"的左边加上空格也不会报错,但是约定,在java里面有句话叫做“约定大于配置”,用在这里虽然不甚恰当,但是它从另一个方面突出了约定的重要性,数组的定义约定不要在"[]"左边加上空格。
数组的内存分配
在定义好了数组之后,并不是说就可以直接访问数组了,如果你正在使用ide编写这个程序,你会发现ide会给你提示错误信息。这是因为定义好的数组jvm并没有给它分配内存空间,自然也就无法访问了,因此要想正常使用定义好的数组,需要你给它分配内存空间,指定数组的长度就是给数组分配了内存,分配的方法如下:
String[] arr1;
String arr2 [];
arr1=new String[3];
arr2=new String[2];
上边的这种写法还可以与数组的定义合并起来,即:在数组定义的时候就给它分配好内存空间,这也是常用的写法:
String[] arr1=new String[3];
String arr2 []=new String[2];
数组的初始化
在指定了数组的长度之后,执行下面的代码:
System.out.println(arr1[0]);
你会发现输出结果为:null,你并没有给数组里面的任何一个元素赋值,这就是输出null的原因,这里的null就是String类型的默认值,每种类型的数组里面的元素都有默认值,根据数据类型的不同而不同,比如:
byte等整型默认为0,
float、double默认为0.0,
char默认空格,
引用类型默认null
我们定义了数组当然不只是为了使用它的默认值,因此我们就需要给数组手动赋值,这个过程叫做“数组的初始化”。
要知道一点:java里面的数组有个特点,就是你要存放几个元素,就定义多长,定义了长度之后,则这个数组的长度不可以被改变,即java里面的数组是固定长度的。
java里面的数组初始化有两种方式:
1.静态初始化:数组的长度大小在编译期间就被确定了,java编译器会根据你写的元素个数与类型确定数组所占的内存空间,比如:int[] numbers=new int[]{1,2};编译器知道int类型在java里面占据4B(4个字节)的内存空间,而numbers这个数组有两个元素分别是“1”,“2”,那么java编译器就能确定numbers占据的内存大小是8个字节。如果你写成了int[] numbers=new int[2]{1,2}; 编译器会告诉你Cannot define dimension expressions when an array initializer is provided,意思就是“你在数组定义的时候已经初始化了,我能算出来将来为这个数组分配多大的内存空间,你现在又给我显式指定一个数组长度,以为我不会算吗,当我傻吗?”,意思就是这个意思了。
2.动态初始化
举例如下:
//静态初始化,也可简写:String[] names={"a","b"};
String[] names=new String[]{"a","b"};
//动态初始化
int [] scores=new int[3];
scores[0]=180;
System.out.println(scores[1]);//结果:0
多维数组
//动态初始化,二种方式
int [][] scores=new int[3][4];
//也可以用下面的方式写
int [][] scores1=new int[3][];
与Java相关的内存结构
栈:局部变量(形参也是)、对象的引用,函数栈帧
堆:new出来的对象(伊甸园、幸存者乐园、年老区、永久代等)+方法区
方法区的概念:
方法区(代码段/模板、类):静态变量(静态域)、常量池(每个字符串当然也有地址:常量池地址,常量池值的共享)、方法、类的信息(一堆属性,方法)、包名,属于堆