1.数组的定义
数组是n(n>=1)个相同/数据类型的数据元素a0,a1,a2,…an-1,存储在地址/连续的/内存单元的/有限集合。
Java中数组是用来存储/同一种/数据类型的/数据,一旦初始化完成,即占用的空间就已固定下来,即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。
2.数组的存储
数组(数据引用和数据对象):数组引用变量/是引用类型的变量,存储在栈(stack)内存中,数组对象/存储在堆(heap)内存当中,通过栈内存中的指针/指向对应对象的在堆内存中的位置来实现访问。
例如:int num[] = new int[4];其中num这个数组变量/并非是数组本身,而是类似指针,存在于栈内存中,指向处于堆内存中实实在在的/数组对象。
以下图说明数组的存储形式。
平常所说的“Java中数组必须要被初始化”,并非是/数组变量/被初始化,而是指/数组对象。数组引用变量/不需要初始化,数组对象/要进行初始化。例如:int num[];是完全合法的,只不过这个/数组变量/没有指向真正的数组,所以不能使用。要使用就必须初始化数组:num = new int[4];这样一个存在于堆内存中的、长度为4的数组的“地址”就被赋给了num,即num“指向”了那个数组。
而且在堆内存当中的数组大小是不能改变的。
什么是栈和堆(参见JVM虚拟机运行时内存区域)
当执行方法时,该方法都会建立自身的内存栈,以用来将该方法内部定义的变量逐个加入到内存栈中,当执行结束时/方法的内存栈也随之销毁,我们说所有变量存放在栈内存中,即随着/寄存主体的消亡而消亡;反之,当我们创建一个对象时,这个对象被保存到运行时/数据区中,以便反复利用,此时不会/随着执行方法的结束而消亡,同时该对象还可被其他对象所引用,只有当这个对象没有/被任何引用变量引用时,才会在垃圾回收在合适的时间点回收,我们说此时变量所指向的运行时数据区存在堆内存中。
数组传递
只有类型兼容,才能将数组引用传递给另一个数组引用,但仍然不能改变数组长度(仅仅只是调整数组引用指针的指向)。
1
2
3
|
int
[]digits =
new
int
[
4
];
int
[]numbers = {
3
,
5
,
12
};
digits= numbers;
|
这时,num 和number这两个数组变量都指向/同一个/数组对象,而digits本身失去引用而变成垃圾,等待垃圾回收来回收(但其长度仍然为4)。
其内部运行机制如下图所示。
因此当我们看一个数组时,通常看成两部分:数组引用变量和数组元素本身,而数据元素是存放在堆内存中,只能通过数组引用变量来访问。
3.基本类型数组
1
2
3
4
5
|
int
[] numbers;
numbers =
new
int
[
4
];
for
(
int
i =
0
;i < numbers.length;i++) {
numbers[i] = i *
10
;
}
|
其内部运行机制如下图所示。
从图中可看出数组元素/直接存放在堆内存中,当操作数组元素时,实际上是操作/基本类型的变量。
4.引用对象数组
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//1.定义数组
Person[] persons;
//2.分配内存空间
persons =
new
Person[
2
];
//3.为数组元素指定值
Person p1 =
new
Person();
p1.age =
28
;
p1.name =
"Miracle"
;
Person p2 =
new
Person();
p2.age =
30
;
p2.name =
"Miracle He"
;
persons[
0
] = p1;
persons[
1
] = p2;
|
对于数组对象/为引用类型/在内存中的存储/与基本类型不一样,此时数组对象/仍然/存放引用,指向另一块内存,在其中存放有效的数据。
其内部运行机制如下图所示。
5.多维数组
从底层来看,数组对象/可以存放/引用类型,包含数组。也就是说在/数组对象/的内部还可以包含数组,如int[][] numbers = new int[length][],即任何多维数组(维度为n,n>1)都当作一维数组,其数组对象为n-1维数组。
对于数组int array[2][],数组变量array存储在栈内存中,它指向堆内存中的一个包含两个对象的数组。其中每个对象的类型是一个引用类型(一维数组类型),并指向一个实实在在的数组。
1
2
3
4
5
6
7
|
//1.定义二维数组
int
[][] numbers;
//2.分配内存空间
numbers =
new
int
[
3
][];
//3.为数组元素指定值
numbers[
0
] =
new
int
[
2
];
numbers[
0
][
1
] =
1
;
|
其内部运行机制如下图所示。