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