数组
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9b7f6361a68b792b3b82c39a4fbbeec7.jpeg)
-
静态初始化:初始化时无需指定数组长度,指定其数组元素即可;例:
String[] s = new String[]{ "张三",//索引位 0 "李四",//索引位 1 "王五" //索引位 2 }; System.out.println("长度为:"+s.length);// 长度为:3
-
动态初始化:初始化时无需指定数组元素,指定其长度即可;例:
String[] s2 = new String[5]; System.out.println("长度为:"+s2.length);// 长度为:5
数组初始化分为静态初始化和动态初始化,且不可同时使用静态和动态初始化方式。Java 中数组初始化后该数组长度就不可再改变,但是在 JavaScript 这种动态语言中,数组是可改变长度的;
那么问题来了,数组一定要初始化吗?
例:
// 定义并初始化数组 a
int[] a = new int[]{1, 2, 3, 4};
// 定义数组变量 b
int[] b;
// 将 b 指向 a 所引用的数组
b = a;
// 遍历 b
for (int i = 0; i < b.length; i++) {
System.out.println(b[i] + " ");//1 2 3 4
}
// 改变 b 的 第二个元素
b[1] = 100;
// 遍历 a
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + " ");//1 2 100 4
}
上面例子中:数组 b 并没有初始化,但是为什么可以使用呢?在数组b指向数组a 后,改变 数组 b 的第二个元素,数组 a 也被改变,又是为什么呢?
其实,如果简单了解过 Java 的存储空间,可以知道在数组初始化时,堆内存空间分配了一个连续的内存空间给数组。上面例子中,数组 a 进行了初始化,分配了内存空间,而数组变量 b 在定义时虽然没有初始化,但是之后其指向了数组a,也相当于数组变量 b 指向了数组 a 分配到的内存空间,就造成了数组 a 和 b 此时都指向了同一个内存空间,也就出现了当改变数组b 的数组元素,数组 a 也受到了影响;那么,也要注意一个问题,数组 和 数组变量的区别,当在局部变量中定义时候,上面例子中的数组变量b 如果没有指向已经初始化的数组 a,那么数组变量 b是不可使用的,如果不进行指向已初始化的数组或其自身不进行初始化,那么是不可直接使用的。
3.基本数据类型数组动态初始化和引用类型数组动态初始化
①关于基本类型数组动态初始化
数据类型 | 初始化值 | |
---|---|---|
浮点类型 | float,double | 0.0 |
字符类型 | char | ‘\u0000’ |
布尔类型 | Boolean | false |
整数类型 | byte,short,int,long | 0 |
②关于引用类型数组动态初始化
首先,创建一个 person 类:
public class Person{
// 定义姓名
public String name;
// 定义身高
public double height;
// 定义年龄
public int age;
// 个人信息
@Override
public String toString() {
return "Person{" +name+"现在"+age+"岁,身高是"+height+"cm" +'}';
}
}
其次,创建引用类型数组
// ①定义引用类型数组
Person[] students;
// ②动态初始化数组长度
students = new Person[2];
// ③创建学生jack对象实例
Person jack = new Person();
jack.name = "jack";
jack.age = 12;
jack.height = 160;
// ④创建学生marry对象实例
Person marry = new Person();
marry.name = "marry";
marry.age = 13;
marry.height = 155;
// ⑤赋值为数组元素
students[0] = jack;
students[1] = marry;
// ⑥遍历
for (int i = 0; i < students.length; i++) {
System.out.println(students[i]);
// Person{jack现在12岁,身高是160.0cm}
// Person{marry现在13岁,身高是155.0cm}
}
如上所示:
当①行定义数组时,并未进行初始化,也表示此时在堆内存中还未分配一段连续的内存空间给 students 数组;
第②行是对 students 数组进行了动态初始化,给予其数组长度为 2,也表示该数组长度为 2,同时 students 数组指向了在堆内存中两个 person 对象,只是此时堆内存中的两个对象值为 null;
第③④行创建了两个学生对象,此时在堆内存空间中分别创建了两个person 对象,并且此时 jack 对象和 marry 对象分别指向其对应创建的对象位置;
第⑤行两个学生对象赋值给了 students 数组,让数组在堆内存中的数组连续内存空间指向了堆内存中 jack 和 marry 对象位置,代表此时 students 数组在堆内存中指向了其两个对象;
著作日期:2020.08.30