Java 如何证明arraylist和linkedlist性能之间的差异

Java 如何证明arraylist和linkedlist性能之间的差异,java,Java,我在读关于LinkedList和ArrayList。我发现很多人说通过ArrayList的迭代比LinkedList快,但同时从LinkedList添加和删除元素比ArrayList快 如何证明这一点 我已经用Java编写了一个实验,并在调试模式下运行了它,但是我没有看到ArrayList和LinkedList之间有任何区别 你对这个问题的态度是什么?如何证明人们所说的是真的 这是我的密码: import java.util.ArrayList; import java.util.LinkedL

我在读关于
LinkedList
ArrayList
。我发现很多人说通过
ArrayList
的迭代比
LinkedList
快,但同时从
LinkedList
添加和删除元素比
ArrayList

如何证明这一点

我已经用Java编写了一个实验,并在调试模式下运行了它,但是我没有看到
ArrayList
LinkedList
之间有任何区别

你对这个问题的态度是什么?如何证明人们所说的是真的

这是我的密码:

import java.util.ArrayList;
import java.util.LinkedList;

public class List {

    public static void main(String[] args) {

        ArrayList<Integer> arraylist = new ArrayList<Integer>();
        arraylist.add(1);
        arraylist.add(2);
        arraylist.add(3);
        arraylist.add(4);
        arraylist.add(5);

        arraylist.remove(1);
        arraylist.remove(2);

        for(int x: arraylist) {

        System.out.println(x);

        }

        LinkedList<Integer> arraylista = new LinkedList<Integer>();
        arraylista.add(1);
        arraylista.add(2);
        arraylista.add(3);
        arraylista.add(4);
        arraylista.add(5);

        arraylista.remove(1);
        arraylista.remove(2);

        for(int x: arraylista) {

            System.out.println(x);

            }

    }
}
import java.util.ArrayList;
导入java.util.LinkedList;
公共班级名单{
公共静态void main(字符串[]args){
ArrayList ArrayList=新的ArrayList();
arraylist.add(1);
arraylist.add(2);
arraylist.add(3);
arraylist.add(4);
arraylist.add(5);
arraylist.remove(1);
arraylist.remove(2);
for(int x:arraylist){
系统输出println(x);
}
LinkedList arraylista=新建LinkedList();
arraylista.添加(1);
arraylista.添加(2);
arraylista.添加(3);
arraylista.添加(4);
arraylista.添加(5);
arraylista.移除(1);
arraylista.移除(2);
用于(int x:arraylista){
系统输出println(x);
}
}
}

由于它们的实现方式,在处理对象本身所带来的额外开销方面,在链表上进行迭代可能会稍微贵一些,但在性能方面,很少有人会让我相信一个比另一个更快

真正的区别在于插入元素,正如你所暗示的那样。我们可以从实际实现的内容和概念的角度来讨论这一点

然后假设您想在列表中插入一个元素。对于
ArrayList
,您需要做出一些决定:

  • 我们是在列表的前面、中间还是后面插入元素
  • 名单是满的还是接近满的
请注意,
ArrayList
将围绕放置值的索引位置展开整个数组,然后插入,除非您在末尾添加-它只会将其添加到单个位置

在这种情况下,
ArrayList
的add操作的摊销运行时对于任何不在末尾的插入为~O(n),对于列表末尾的插入(通常)为O(1)(取决于它是否需要为其内部数组留出更多空间)

/**
*将指定的元素追加到此列表的末尾。
*
*要附加到此列表的@param e元素
*@return true(由{@link Collection#add}指定)
*/
公共布尔加法(E){
确保RecapacityInternal(大小+1);//递增modCount!!
elementData[size++]=e;
返回true;
}
/**
*将指定的元素插入此文件中的指定位置
*名单。移动当前处于该位置的元件(如果有),并
*右侧的任何后续元素(将一个元素添加到其索引中)。
*
*@param index将插入指定元素的索引
*@param元素要插入的元素
*@throws IndexOutOfBoundsException{@inheritDoc}
*/
公共void add(int索引,E元素){
rangeCheckForAdd(索引);
确保RecapacityInternal(大小+1);//递增modCount!!
System.arraycopy(elementData,索引,elementData,索引+1,
尺寸指数);
elementData[索引]=元素;
大小++;
}
对于
链接列表
,决策通常更容易-由于它是双重链接的,所以在列表的前面或后面添加节点是O(1)。然而,插入到任何索引位置都需要保证O(n),否则,因为在找到要插入的节点之前,必须迭代一定数量的元素


基准测试可能会有所帮助(尽管您的基准测试被严重破坏),但在这种情况下,更仔细地观察实现可能会更好。

由于它们的实现方式,在链表上进行迭代可能会因为处理对象本身而产生的额外开销稍微贵一些,但就性能而言,几乎没有什么能让我相信一个比另一个更快

真正的区别在于插入元素,正如你所暗示的那样。我们可以从实际实现的内容和概念的角度来讨论这一点

然后假设您想在列表中插入一个元素。对于
ArrayList
,您需要做出一些决定:

  • 我们是在列表的前面、中间还是后面插入元素
  • 名单是满的还是接近满的
请注意,
ArrayList
将围绕放置值的索引位置展开整个数组,然后插入,除非您在末尾添加-它只会将其添加到单个位置

在这种情况下,
ArrayList
的add操作的摊销运行时对于任何不在末尾的插入为~O(n),对于列表末尾的插入(通常)为O(1)(取决于它是否需要为其内部数组留出更多空间)

/**
*将指定的元素追加到此列表的末尾。
*
*要附加到此列表的@param e元素
*@return true(由{@link Collection#add}指定)
*/
公共布尔加法(E){
确保RecapacityInternal(大小+1);//递增modCount!!
elementData[size++]=e;
返回true;
}
/**
*将指定的元素插入此文件中的指定位置
*名单。移动当前处于该位置的元件(如果有),并
*右侧的任何后续元素(将一个元素添加到其索引中)。
*
*@param index指定el所在的索引
/**
 * Appends the specified element to the end of this list.
 *
 * @param e element to be appended to this list
 * @return <tt>true</tt> (as specified by {@link Collection#add})
 */
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

/**
 * Inserts the specified element at the specified position in this
 * list. Shifts the element currently at that position (if any) and
 * any subsequent elements to the right (adds one to their indices).
 *
 * @param index index at which the specified element is to be inserted
 * @param element element to be inserted
 * @throws IndexOutOfBoundsException {@inheritDoc}
 */
public void add(int index, E element) {
    rangeCheckForAdd(index);

    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}
int[] array = new int[1];
array.add(0);
int[] temp = new int[2];
for(int i = 0; i < array.length; i++) {
    temp[i] = array[i];
}
array = temp;