Java 插入ArrayList的中间会移动对象还是移动引用?
将元素添加到Java ArrayList的末尾应该需要0(1)个时间。但是,在中间添加一个元素时,必须将右半部分移动一个以保持顺序。这需要O(n)时间(实际上O(n/2)简化为O(n)) 我的问题是: 在原始内存中,这个移位是移动驻留在ArrayList中的对象本身,还是仅仅移动指向它们的引用 不管是哪一种,时间复杂度都是相同的,但开销可能会大不相同。把一堆巨大的物体移到一边为中间腾出空间可能比在内存中移动一些int大小的引用要大得多。 因此:Java 插入ArrayList的中间会移动对象还是移动引用?,java,arraylist,Java,Arraylist,将元素添加到Java ArrayList的末尾应该需要0(1)个时间。但是,在中间添加一个元素时,必须将右半部分移动一个以保持顺序。这需要O(n)时间(实际上O(n/2)简化为O(n)) 我的问题是: 在原始内存中,这个移位是移动驻留在ArrayList中的对象本身,还是仅仅移动指向它们的引用 不管是哪一种,时间复杂度都是相同的,但开销可能会大不相同。把一堆巨大的物体移到一边为中间腾出空间可能比在内存中移动一些int大小的引用要大得多。 因此: 是哪一个?我倾向于猜测是引用被转移了,因为Java
Arraylist在内部使用数组。对象的引用保留在数组中。这些引用所指向的对象可以在内存中的任何位置,也不一定是按顺序排列的。它只是arraylist内部数组中的引用,有助于使用数组索引获取对象。只是为了用arraylist类中的代码证实上面的语句
@Override public void add(int index, E object) {
Object[] a = array;
int s = size;
if (index > s || index < 0) {
throwIndexOutOfBoundsException(index, s);
}
if (s < a.length) {
System.arraycopy(a, index, a, index + 1, s - index);
} else {
// assert s == a.length;
Object[] newArray = new Object[newCapacity(s)];
System.arraycopy(a, 0, newArray, 0, index);
System.arraycopy(a, index, newArray, index + 1, s - index); //shifting to right
array = a = newArray;
}
a[index] = object;
size = s + 1;
modCount++;
}
@Override public void add(int索引,E对象){
Object[]a=数组;
int s=大小;
如果(索引>s | |索引<0){
throwIndexOutOfBoundsException(指数s);
}
如果(s
ArrayList
由一个数组作为后盾,从内存中插入值时,它会对元素执行系统操作。arraycopy
(这是一种本机方法)可将其移动。数组本身只维护对内存中对象的引用,因此对象不受操作的影响。在Java中,您永远不会处理“对象本身”。移动的是引用。ArrayList
实际上正在保存引用。所以,当你移动你周围的东西时,它仍然在使用引用。它是连续内存块,我想它会改变对象的元素,以适应列表中间的新元素。不过我可能错了。[这个]()所以这个问题应该对这个问题有所帮助