1.数组的定义。
数组:是一种容器,可以同时存放多个同类型的数据值。数组是一种引用数据类型,它的长度在运行期间不可改变。
数组的初始化:在内存中创建一个数组,并且向其中赋予一些默认的值。
两种初始化方法:
(1)静态初始化(指定内容):
标准格式:数据类型[ ] 数组名称 = new 数据类型[]{元素1,元素2,...} 例:int[ ] arr = new int[ ]{2,3,5};
省略格式:数据类型[ ] 数组名称 = {元素1,元素2,...} 例:int[ ] arr = {2,3,5};
(2)动态初始化(指定长度):数据类型[ ] 数组名称 = new 数据类型[数组长度] 例:int[ ] arr = new int[5];
使用动态初始化数组时,系统会默认给每个元素分配一个默认值。如果数组是整数类型,那么默认为0;如果数组是浮点型,默认为0.0,;如果数组是字符型,那么默认为‘\u0000’(这是一个不可见字符);如果是布尔类型,那么默认为false;如果是引用类型,那么默认为null。
注意事项:
(1)静态初始化没有直接指定数组的长度,但是可以根据中括号中元素的个数来直接推算出数组的长度。
(2)静态数组和动态数组标准初始化部分都可以拆分成两个语句(声明和分配内存),如下。但是省略格式不能拆分。
(3)直接打印数组名称,并不能访问数组内部的元素,而是会返回数组对应的:内存地址哈希值。
(4)静态初始化也有默认值的过程,但是系统会自动马上将中括号内的数据替换。
(5)数组必须进行new初始化才能使用其中的元素,如果只是赋值为null,没有进行new创建,那么将会发生空指针异常(NullPointerException)。
2.内存分配
(1)JAVA内存划分。
下图是数组在内存中的存储情况。方法区主要存放定义的方法以及参数的一个情况;然后系统会在栈中为该方法开辟一块内存用来存放该方法的变量,以数组为例,声明int类的array,栈中存放的是他在堆中的地址值(0x666);堆中会根据不同类型的数据来分配内存,例如一个长度为3的数组,然后每一个小块存放一个int类型的数据,可以通过右侧对应的索引值来访问。
下面两个图分别代表:(1)分别创建两个不同名称的数组,并分配内存,他们的地址值不同。(2)分别创建两个不同名称的数组,但是将数组A赋值给数组B,此时他们的地址相同。
3.数组相关方法。
(1)获取数组长度。 格式:数组名称.length 返回:一个int数组,代表数组长度。
注意:数组一旦创建,那么在程序运行期间,长度不可改变。(下图arrayC被new了两次,长度就被3->5,这不是长度改变了么?其实不是,arrayC只是一个变量名,并且new之后,只是把数据的地址值改变了,但是长度为3和长度为5的数组在堆中是仍然存在的。)
注意:数组可以作为方法的参数,在传参过程中,时间传进去的是数组的地址值(引用),这个和C++是有区别的。