【发布时间】:2018-08-03 12:27:54
【问题描述】:
假设以下代码:
ArrayList<A> aList = new ArrayList<>();
for(int i = 0; i < 1000; ++i)
aList.add(new A());
A anElement = aList.get(500);
for(int i = 0; i < 100000; ++i)
aList.add(new A());
之后 anElement 仍然正确引用 aList[500],即使 ArrayList 可能在第二个 for 循环期间多次重新分配其数据。这个假设是否不正确,如果不正确,Java 如何设法让 anElement 仍然指向内存中的正确数据?
我的理论是,要么不是释放内存 anElement 引用,而是内存现在指向当前的 aList 数据,或者当数组增长时更新 anElement 的引用。然而,这两种理论都具有非常糟糕的空间/时间性能影响,所以我认为它们不太可能。
编辑:
我误解了数组是如何存储元素的,我以为它们直接存储它们,但实际上它们存储引用,这意味着 anElement 和 aList[500] 都指向堆上的某个对象,解决了我无法理解的问题!
【问题讨论】:
-
将元素移动到哪里?