对Java中的数组的理解
Student[] students = new Student[]{
new
Student(
"Tom"
,15),
new
Student(
"Jack"
,19),
new
Student(
"Rose"
,17),
new
Student(
"Jone"
,20)
};
以上语句声明一个
Student类型的数组
students,并使用静态初始化方式进行初始化。初始化完成后产生了4个Student类型的对象,
以及相应的4个Student类型的引用
students[0]~
students[3]。在内存中的示意图如下:
for(int i = 0;i < students .length;i++)
{
students[i] = students[0];
}
以上语句将数组中的所有元素赋值为students[0],该赋值语句并没有将students[0]中的数据拷贝到studens[i]中,仅仅只是将上图
中的4个Student类型的引用指向第0个Student对象,赋值后的内存示意图如下:
这样一来Jack,Rose,Jone这三个对象成了垃圾,等着垃圾收集器来回收。为了证实此观点编写一下程序:
package gc;
public
class
ArrayTest {
static
class
Student
{
public
String
name
;
public
int
age
;
public
Student(String n,
int
a)
{
System.
out
.println(
"create student"
);
this
.
name
= n;
this
.
age
= a;
}
public
void
finalize()
{
System.
out
.println(
"finalize"
);
}
public
String toString()
{
return
"[ "
+
name
+
","
+
age
+
" ]"
;
}
}
public
static
void
main(String[] args) {
//
TODO
Auto-generated method stub
Student[] students =
new
Student[]{
new
Student(
"Tom"
,15),
new
Student(
"Jack"
,19),
new
Student(
"Rose"
,17),
new
Student(
"Jone"
,20)
};
for
(
int
i = 0;i < students .
length
;i++)
{
students [i] = students [0];
}
System.gc();
}
}
输出如下: