基本类型的数组有3种赋值形式
1.int[] arr ={1,2,3};
2.int[] arr = new int[]{1,2,3};
3.int[] arr =new int[3];
arr[0] = 1;arr[1]=2 ;arr[2]=3;
第一种和第二种都是预先知道数组的内容,第三种是先分配长度,然后再给每个元素赋值。在第三种形式中,即使没有给每个元素赋值,每个元素也都有一个默认值,这个默认值跟数组类型有关,数值类型的值为0,boolean 为false,char类型为空字符。
数组的长度可以动态确定,
int length = ...;
int arr =new int[length];
数组的长度虽然可以动态确定,但定了之后就不可以变。数组有一个length属性,但只能读,不能改。
还有一个细节,不能在给定初始值的同时给定长度。如下格式是不允许的:
int [] arr = new int[3]{1,2,3}
因为初始值已经决定了长度,再给个长度,如果不一致,计算机将无所适从。
数组类型和基本类型是有明显不同的,一个基本类型的变量,内存中只会有一块对应的内存空间。但数组有两块:一块用于存储数组内容本身,另一块用于存储内容的位置。如下表,有一个int变量a,以及一个int数组变量arr,其代码、变量对应的内存
和内存内容如下表表示:基本数据类型a的内存地址是1000 这个位置存储的就是它的值100。数组类型arr的内存地址是2000,这个位置存储的值是一个位置3000,3000开始的位置存储的才是实际的数据,“1,2,3”.
代码 | 内存地址 | 内存数据 |
int a = 100; | 1000 | 100 |
int[] arr ={1,2,3}; | 2000 | 3000 |
3000 | 1 | |
3004 | 2 | |
3008 | 3 |
为什么数组要用两块空间?不能只用一块空间:
int[] arrA ={1,2,3};
int[] arrB ={4,5,6,7};
arrA =arrB;
这段代码中,arrA初始长度是3,arrB的长度是4,后来将arrB赋值给arrA,如果arrA对应的空间是直接存储的数组内容,那么它将没有足够的空间去容纳arrB的所有元素。
用两块空间存储就简单得多,arrA存储的值就和arrB的一样了,存储的都是数组{4,5,6,7}的地址arrA和arrB是一样的了,而arrA的内存空间由于不再被引用会进行垃圾回收。
由上可以看出,数组变量赋值和给数组中元素赋值是两回事,给数组元素赋值是改变数组的内容,而给数组变量赋值则会让变量指向一个不同的位置。
上面说的数组长度不可以改变是数组的内容空间,一经分配,长度就不能再变了,但可以改变数组的值,让它指向一个长度不同的空间,就像上列中的arrA后来指向了arrB一样。
给变量赋值就是将变量对应的内存空间设置为一个明确的值,有了值以后,变量可以被加载到CPU中,CPU可以对这些值进行各种运算,运算后的结果又可以被赋值给变量。保存到内存中。