Java 插入ArrayList的中间会移动对象还是移动引用?

Java 插入ArrayList的中间会移动对象还是移动引用?,java,arraylist,Java,Arraylist,将元素添加到Java ArrayList的末尾应该需要0(1)个时间。但是,在中间添加一个元素时,必须将右半部分移动一个以保持顺序。这需要O(n)时间(实际上O(n/2)简化为O(n)) 我的问题是: 在原始内存中,这个移位是移动驻留在ArrayList中的对象本身,还是仅仅移动指向它们的引用 不管是哪一种,时间复杂度都是相同的,但开销可能会大不相同。把一堆巨大的物体移到一边为中间腾出空间可能比在内存中移动一些int大小的引用要大得多。 因此: 是哪一个?我倾向于猜测是引用被转移了,因为Java

将元素添加到Java ArrayList的末尾应该需要0(1)个时间。但是,在中间添加一个元素时,必须将右半部分移动一个以保持顺序。这需要O(n)时间(实际上O(n/2)简化为O(n))

我的问题是:

在原始内存中,这个移位是移动驻留在ArrayList中的对象本身,还是仅仅移动指向它们的引用

不管是哪一种,时间复杂度都是相同的,但开销可能会大不相同。把一堆巨大的物体移到一边为中间腾出空间可能比在内存中移动一些int大小的引用要大得多。 因此:

  • 是哪一个?我倾向于猜测是引用被转移了,因为Java列表包含对堆上对象的引用,这些对象在内存中可能以任何“顺序”排列

  • 我对以上所有内容的表述有错误吗

  • 我问的原因纯粹是理论上的。我只是想知道内存中发生了什么,是否有大块的对象被交换,或者是否只是引用被洗牌。谢谢

    (注意:这几乎是我今天早些时候问的后续问题。)

    在原始内存中,此移位是否会移动对象本身 驻留在ArrayList中,还是仅驻留指向它们的引用

    简短回答:不移动实际对象,只将引用复制到具有新索引的arraylist的内部数组中

    是哪一个?我倾向于猜测这是参考文献 移位,因为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
    实际上正在保存引用。所以,当你移动你周围的东西时,它仍然在使用引用。它是连续内存块,我想它会改变对象的元素,以适应列表中间的新元素。不过我可能错了。[这个]()所以这个问题应该对这个问题有所帮助