前言
提示:本文是我初学Java对数组相关知识的总结,避免之后忘掉一些细节,因为本人有c语言基础,一些过于简单通俗的不会赘述。
一、数组的定义格式
格式1:数据类型[] 数组名; 例:int[] a;
格式2:数据类型 数组名[]; 例: int a[];
(这俩中定义并没有什么区别,格式不同而已,推荐使用前一种。据说后一种是当初为了挖C语言工程师,刻意做出的对c语言的兼容)
注意:
1.Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
2.数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,即使没有显示的初始化, 其中的每个元素也被按照实例变量同样的方式被隐式初始化。
二、数组的初始化
1.动态初始化
动态初始化时只指定数组的长度,由系统为数组分配初始值
格式:数据类型[] 数组名 = new 数据类型[数组长度];
举例:int[] a=new int[3];
2.静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
格式:数据类型[] 数组名 = {数组元素};
举例:int[] a={1,2,3};
三、数组的内存分配
1.在此我通过举例来逐步认识学习数组的内存分配
//定义一个数组
int[] a=new int[3];
//此时输出
System.out.println(a);
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
输出a得到的是数组的首地址,输出数组元素时因为我们没有初始化,所以其元素默认为0。
在前边代码基础上继续
int[] b=new int[3];
//分别输出a,b的地址
System.out.println(a);
System.out.println(b);
a,b的地址显然不等
那如果这样做呢?
int[] b=new int[3];
System.out.println(a);
System.out.println(b);
//把a赋给b
b=a;
System.out.println(a);
System.out.println(b);
结果如图,在把a赋给b之前a、b地址不相等,而在此之后a、b的地址均等于原来a的地址。实际上,此时a和b指向同一块内存,而b之前指向的地址,由于没有途径可以再次找到,就被系统自动释放掉了。
a和b指向同一块地址怎么理解?
int[] a=new int[3];
//此时输出
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
int[] b=new int[3];
b=a;
b[0]=123;
b[1]=456;
b[2]=789;
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
同样是输出a数组的元素,在改变b数组的元素的值后,a数组元素的值也发生相应的改变,因为a、b操作的是同一块地址。
2.内存分配总结
如果输出a[0],a[1],a[2]的地址,会发现,这三个地址并不是连续的且毫无规律。这是因为在Java不向程序员暴漏地址,对地址的调用是完全交给虚拟机的。而在C++中如果输出a[0],a[1],a[2]的地址,则会得到连续的地址,因为C/C++支持指针的使用。
以下是Java内存分配方式总结
四、数组的特点
1.数组的长度是固定的,被创建后,就不能再次改变
2.java中的数组实际上是对象实例,所以可以用变量初始化长度
例: int a=3; int b=new int[a];
3.数组变量属引用类型,数组即对象,数组中的每个元素即该对象的成员变量。
4.数组中的元素,类型一定是相同的,不可以混合使用。它的元素类型可以是基本类型也可以是引用类型
5.数组索引范围从零到数组长度减一