基本类型的数组有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可以对这些值进行各种运算,运算后的结果又可以被赋值给变量。保存到内存中。