List和Set的区别

2019/08/21 Java 集合

Java 中的集合主要分为三类:Set(集),List(列表),Map(映射)。Set 集合是比较简单的一种集合。主要实现类有 HashSet 和 TreeSet。Set 集合中的对象的时无序的,并且不会重复的。List 集合是以线性存储元素的,主要的实现类有 ArrayList 和 LinkedList。List 集合的元素,是有序的并且可重复的。


HashSet

  • HashSet 的底层实现是 HashMap 的 keySet()。
  • HashSet 是按照 Hash 算法来存储和读取元素的,存取速度较快。访问成本是O(1)。
  • HashSet 的元素可以为 null。

TreeSet

  • TreeSet 的底层实现是 TreeMap。
  • TreeSet 的元素不允许为 null。

ArrayList

  • ArrayList 的底层实现是一个动态数组。我们知道,数组一旦初始化之后,长度就不可变化。这里的动态数组,是指重新生成一个数组,并把之前的数组内容 copy 过去。
  • ArrayList 中插入和删除元素的速度较慢,因为涉及到数组的元素移动。
  • ArrayList 的元素也可以是 null。

LinkedList

  • LinkedList 的底层实现是基于双向链表的。
  • LinkedList 的插入和删除速度由于 ArrayList, 读取速度比 ArrayList 差。
  • LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
  • get方法,利用二分法来查找元素。

区别

名称 底层实现 增删 查 线程安全 有序 元素可重复 元素可为空
HashSet HashMap 较快 较快 否 否 否 是
TreeSet TreeMap 较慢 较慢 否 是 否 否
ArrayList 动态数组 较慢 较快 否 是 是 是
LinkedList 双向链表 较快 较慢 否 是 是 是

时间复杂度

对象 add方法 get方法 contains方法
HashSet O(1) O(1) O(1)
TreeSet O(logn) - O(logn)
ArrayList O(1) O(1) O(n)
LinkedList O(1) O(1) O(n)

总结

  • 集合元素可重复,使用 List。反之使用 Set。
  • 查询操作较多,建议使用 ArrayList。
  • 增删元素较多,建议使用 LinkedList。

Search

    Table of Contents