JAVA LinkedList和ArrayList的使用及性能分析

  

JAVA LinkedList和ArrayList的使用及性能分析

1.介绍

在JAVA中,LinkedList和ArrayList都是常见的集合类。两种集合类都可以实现List接口,用于存储一组有序的数据。但是,它们在内部实现、性能以及使用场景上存在很大的差异。

LinkedList使用链表来实现,每一个节点都存储了当前元素的值和下一个节点的地址。由于链表的特点,LinkedList的插入和删除操作都比较快。但是,访问某一个特定位置的元素很慢,因为要遍历整个链表。

ArrayList使用可变数组来实现。由于数组是在内存中连续存储的,所以可以直接通过下标访问元素,因此ArrayList的访问操作速度很快。但是,插入和删除操作涉及到要移动许多元素,所以速度比LinkedList慢。

2.使用LinkedList

2.1 创建LinkedList

LinkedList的创建非常简单,只需用无参构造函数创建一个空的LinkedList即可。

LinkedList<Integer> linkedList = new LinkedList<Integer>();

2.2 添加元素

LinkedList提供了很多添加元素的方法。例如,常用的add()方法可以在指定的位置添加一个元素。

linkedList.add(1);
linkedList.add(3);
linkedList.add(5);
linkedList.add(1, 2);

以上代码在链表中插入了四个元素。其中,add(1, 2)在下标为1的位置插入元素2。

2.3 修改和删除元素

LinkedList提供了set()方法用于修改指定下标的元素,remove()方法用于删除指定下标的元素。

linkedList.set(1, 4);
linkedList.remove(2);

以上代码将下标为1的元素修改为4,同时删除下标为2的元素。

2.4 遍历LinkedList

LinkedList可以使用Iterator迭代器进行遍历,也可以使用for-each循环进行遍历。

for(int i = 0; i < linkedList.size(); i++) {
    System.out.print(linkedList.get(i) + " ");
}

Iterator<Integer> it = linkedList.iterator();
while(it.hasNext()) {
    System.out.print(it.next() + " ");
}

2.5 使用示例

以下代码展示了如何使用LinkedList进行队列操作。向队列中添加元素使用add()方法,从队列中取出元素使用poll()方法。

LinkedList<String> queue = new LinkedList<String>();
queue.add("apple");
queue.add("banana");
queue.add("orange");

System.out.println(queue.poll()); // apple
System.out.println(queue.poll()); // banana
System.out.println(queue.poll()); // orange

3.使用ArrayList

3.1 创建ArrayList

创建ArrayList需要指定初始容量。

ArrayList<Integer> arrayList = new ArrayList<Integer>(10);

3.2 添加元素

和LinkedList一样,ArrayList也有很多添加元素的方法。例如,add()方法可以添加元素到末尾。

arrayList.add(1);
arrayList.add(3);
arrayList.add(5);

3.3 修改和删除元素

ArrayList提供了set()方法用于修改指定下标的元素,remove()方法用于删除指定下标的元素。

arrayList.set(1, 4);
arrayList.remove(2);

以上代码将下标为1的元素修改为4,同时删除下标为2的元素。

3.4 遍历ArrayList

使用for-each循环进行遍历。

for(int i = 0; i < arrayList.size(); i++) {
    System.out.print(arrayList.get(i) + " ");
}

3.5 使用示例

以下代码展示了如何使用ArrayList进行栈操作。向栈中添加元素使用add()方法,从栈中取出元素使用remove()方法。

ArrayList<String> stack = new ArrayList<String>();
stack.add("apple");
stack.add("banana");
stack.add("orange");

System.out.println(stack.remove(stack.size()-1)); // orange
System.out.println(stack.remove(stack.size()-1)); // banana
System.out.println(stack.remove(stack.size()-1)); // apple

4.性能分析

实际使用中,选择合适的数据结构非常重要。以下是LinkedList和ArrayList的性能分析。

4.1 LinkedList的优势

  1. 在插入和删除操作中,LinkedList比ArrayList更快。
  2. 不需要预留内存空间,在空间利用率上比ArrayList表现更优。
  3. 在进行多次插入和删除操作时,LinkedList相对来说会更快一些。

4.2 ArrayList的优势

  1. 在访问操作中,ArrayList比LinkedList更快。
  2. 使用时不需要频繁扩容,效率比LinkedList高。

4.3 如何选择

  1. 如果需要大量添加或删除元素,或者元素数量不确定,使用LinkedList。
  2. 如果需要频繁访问元素,或者已知元素数量不会超过初始容量,使用ArrayList。

5.总结

LinkedList和ArrayList都是常用的集合类,它们有各自优劣势。用好它们,可以大大提高程序的效率和稳定性。

相关文章