【发布时间】:2017-06-23 00:16:54
【问题描述】:
我们有代码:
Iterator<Object> it = new Collection<Object>(){/*...implementation...*/}.iterator();
问:垃圾收集器会删除我为表达收集而创建的对象吗?形式上,我们没有对这个对象的引用,但it (Iterator <Object>) 仍然与我们的匿名类对象的内部相连。
换句话说,考虑一下代码:
Iterator<Object> it = new Collection<Object>(){ // String (1)
private Object[] array;
public Iterator<Object> iterator(){
/*Here, an iterator that references this.array is returned
+ Performing its tasks*/
}
/* + other implementation...*/
}.iterator();
那么 GC 是否会删除第一行创建的对象,而我们客观上没有链接到该对象? //String (1)
对于那些特别喜欢编写伪答案的人,这里是我的迭代器的代码:
Iterator<Object> it = new Collection<Object>() { // String (1)
private Object[] array2;
@Override
public Iterator<Object> iterator() {
return new Iterator<Object>() {
Object[] array;
{
array = array2;
}
@Override
public boolean hasNext() {
// We do what is necessary
return false;
}
@Override
public Object next() {
// We do what is necessary
return null;
}
};
}
/* + other implementation... */
}.iterator();
小额外问:
我可以将 Collection 实现中的“array2”重命名为“array”吗?那么如何在Iterator的实现中使用它呢?
return new Iterator<Object>() {
Object[] array;
{
array = array2; // array = array ? It doesn't work. How refer to array above
}
// and so on...
关于重复...不是this question。也许看起来像,但我想收到关于删除问题的答案。这会发生还是不会发生,为什么? + 收到其他问题的答案很重要。 That question 可以帮助别人理解我的问题的答案,但不是我。
【问题讨论】:
-
垃圾收集器永远不应该删除你的程序仍然需要的任何对象。
标签: java collections garbage-collection