如果我有一个阵列说 -
int[] a = new int[10];
Java GC在进行收集时会将其视为10个对象还是单个对象?
更新
所以根据给定的答案,从GC的角度来看它不是更有效而不是
List l;
for(i =0;i<1000;i++)
l.add(new MyObj(343,"asdfasfd"));
我们应该做 -
int[] a; String[] b;
for(i =0;i<1000;i++) {
a[i]=343;
b[i] = "asfasfsafsaf";
}
因为在第一种情况下我们最终创建了1000个额外的对象,而在第二种情况下我们没有。
答案 0 :(得分:10)
这是一个单一的对象。数组是一个连续的对象,int
是基本类型,而不是对象类型,因此没有为10 int
创建的对象。
// 1 object
int[] intArray = new int[10];
如果你有一个10 Object
的数组,则会有11个对象:10个对象加上数组。数组本身仍然只是一个对象;它碰巧包含对其他10个对象的引用。
// 1 object...
Object[] objectArray = new Object[10];
// ...Plus 1 for each element once they are instantiated.
for (int i = 0; i < 10; ++i) {
objectArray[i] = new Object();
}
答案 1 :(得分:3)
就垃圾收集而言,数组是单个对象。如果它是一个原始类型数组,如int
,那么只涉及一个对象,整个数组都是GC'd,或者都不是。
如果你有一个引用类型数组,比如Object
,那么这就是数组的一个对象,加上最多10个对象用于数组引用的引用类型(所以10个引用的数组可能涉及最多11个对象)。如果从数组中删除其中一个对象,比如将其设置为null
,或者用另一个对象覆盖它,并且如果该对象未被其他任何变量引用,那么它将有资格进行垃圾回收。例如:
Object a = new Object(); // "Our Object"
Object[] array = new Object[10];
array[0] = a;
a = null; // a no longer references our Object
// now array[0] is the only reference to our Object
// and it isn't eligible for garbage collection yet
array[0] = null;
// Now our Object is eligible for garbage collection
答案 2 :(得分:3)
一个真正的答案(在某种意义上说,会告诉你第一个案例是否实际上更加垃圾收集)将会让那些比我更了解垃圾收集器的人。
但尝试假装垃圾收集器真的那么重要吗? String
和MyObject
的生命周期几乎相同,GC非常聪明。你可能会略微改善你的垃圾收集时间,但你需要为此付出代价,不得不手动管理两个阵列 - 基本上放弃OO - 代码复杂性和可能的错误是一个令人讨厌的增加。