集合 List、Map、Set 的区别与联系

集合的类型

集合类型包括 List(列表)、Set(集)和 Map(映射)三种。
集合 List、Map、Set 的区别与联系
集合的结构特点

  1. ListSet 是存储单列数据的集合,Map 是存储键值对这样的双列数据的集合;
  2. List 中存储的数据是有顺序的,并且值允许重复Map 中存储的数据是无序的,它的键不允许重复,但值允许重复Set 中存储的数据是无序的,并且不允许重复

特别说明Set 中的元素位置是由元素的 hashcode 决定,即位置是固定的(Set 集合是根据 hashcode 来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说Set 中的元素还是无序的)。

List

List 接口继承了 Collection 接口以定义一个 允许有重复项有序 集合。

List 接口有三个实现类:

  1. ArrayList:底层数据结构是数组,关注的是索引,允许对元素进行快速随机访问(查询快),但是插入和删除元素会伴随后面数据的移动(增删慢);效率高,线程不安全。
  2. LinkedList:底层数据结构是链表,内存非连续,增删快查找慢,效率高,线程不安全。
  3. Vector:底层数据结构是数组增删慢查找慢,效率低,线程安全。

Set

Set 接口继承 Collection 接口,是 无序 的,且 不允许存在重复项

Set 接口有三个实现类:

  1. HashSet:底层数据结构是哈希表,无序且不允许有重复值,增删快;依赖方法 hashCode() 和 equals()。
  2. LinkedHashSet:HashSet 的子类,继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层数据结构是链表和哈希表,使用的是 LinkedHashMap,由链表保证元素有序,哈希表保证元素唯一。
  3. TreeSet:底层数据结构是红黑树,以升序对对象进行排序,TreeSet 类使用了一个 TreeMap。

HashSet 添加元素的执行顺序:首先判断 hashCode() 值是否相同;若相同则继续执行 equals(),若其返回值是 True 说明元素重复,不添加,是 False 就直接添加到集合;若不同就直接添加到集合。

Map

Map 接口不是 Collection 接口的继承,而是从自己的用于维护键值对关联的接口层次结构入手,按定义,该接口描述了 从不重复的键到可重复的值 的映射。

Map 接口有四个实现类:

  • HashMap:底层数据结构是哈希表,支持 null 值和 null 键,效率高,线程不安全。
  • LinkedHashMap:HashMap 子类,底层数据结构是链表和哈希表,由链表保证元素有序,哈希表保证元素唯一。保存了记录的插入顺序。
  • TreeMap:底层数据结构是红黑树,能够把它保存的记录根据键排序,默认是键值的升序排序。
  • HashTable:底层数据结构是哈希表,不支持 null 值和 null 键,效率低,线程安全。

HashMap 和 HashTable 区别

  • HashMap 是线程不安全的,HashMap 是 Map 的一个子接口,通过键的映射得到值,不允许键重复,允许空键和空值,由于非线程安全,HashMap 的效率要较 HashTable 的效率高一些;
  • HashTable 是线程安全的集合,不允许空键或空值;HashTable 被多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时候需要自己为它的方法实现同步。

List、Set 和 Map 的区别

  1. ListSet 都继承自 collection 接口,Map 则不是。
  2. List 集合中对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如可以通过 list.get(i) 方法来获取集合中的元素;
  3. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复
  4. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它能对集合中的对象按照特定的方式排序,例如 TreeSet 类。

总结

List 里存放对象是 有序、可重复的List 关注的是索引,查询速度快,但插入或删除数据时会伴随着后面数据位置的变化,所以插入删除数据速度慢。Set 存放对象是 无序、不可重复的,set 中的对象不按特定方式排序,只是简单地把对象加入集合中,查询元素速度慢,但插入和删除效率高,因为不会引起元素的位置变化。Map 里存放的是键值对,键不能重复,值可以重复,根据键可以得到值,其中所有的键组成一个 set 集合,所有值组成一个 list 集合。ListSet 继承 Collection,属于单列集合,而 Map 属于双列集合


参考:三大集合:List、Map、Set的区别与联系