java集合体系

58 阅读2分钟

Java List 接口及其实现类对比

List 接口是 Java 集合框架中的一种有序集合,它允许元素按插入顺序存储,并且可以通过索引(角标)访问元素。元素可以重复,适合存储多个相同的元素。List 接口的常见实现类有 VectorArrayListLinkedList,它们各自具有不同的特性和适用场景。本文将对这三者进行详细对比。

1. Vector

  • 数据结构:内部使用数组来存储数据。
  • 线程安全:是同步的,意味着它的操作是线程安全的。
  • 性能:由于同步机制,Vector 的增删和查询操作通常较慢。增删时需要锁定整个对象,因此多线程环境下有较高的性能开销。
  • 特点:每次容量增长为原来的一倍(100%扩展)。由于同步开销及容量增长的设计,Vector 已经不常用,通常被认为是过时的类。

2. ArrayList

  • 数据结构:内部使用数组来存储数据。

  • 线程安全:ArrayList 是不同步的,不保证线程安全,因此在多线程环境下使用时需要额外的同步控制。

  • 性能

    • 查询:由于数组的内存是连续分配的,所以通过索引,可以直接找到内存地址,从而找到实际元素,ArrayList 在查询操作上相对较快。查询时通过数组的索引直接访问元素,时间复杂度为 O(1)。
    • 增删:增删操作较慢,因为数组的大小是固定的,插入或删除元素时,可能需要移动大量元素。删除和插入元素的时间复杂度为 O(n)。
  • 特点:查询操作性能较高,适用于查询频繁且不常修改的场景。

3. LinkedList

  • 数据结构:内部使用链表(双向链表)来存储数据。

  • 线程安全:LinkedList 是不同步的,操作时不保证线程安全。

  • 性能

    • 查询:由于链表是由节点连接而成,内存是非连续的,因此查询操作较慢。为了找到特定的元素,可能需要遍历链表。查询时间复杂度为 O(n)。
    • 增删:增删操作速度非常快。由于链表的内存空间不连续,元素的插入和删除仅需要改变相应节点的指针即可,无需移动其他元素。因此,增删操作的时间复杂度为 O(1)。
  • 特点:LinkedList 适用于频繁进行增删操作的场景,如队列或栈的实现。