谈谈Map、List、Set的区别

Java中的集合主要分为三类:

  • List(列表)
  • Set(集合)
  • Map(键值对)

Map、List、Set三者关系图

 Set集合

Set(集合)特点:存储的数据不保证有序(存在有序情况),不允许重复元素,可以存放空元素,但只允许一个空元素存在。

Set主要有三个实现类

  • HashSet:是线程不同步的,HashSet类按照hash算法来存取集合中的对象,存储的数据不保证有序(存在有序情况),存取速度快。存入HashSet的对象必须定义hashCode()。 
  • TreeSet:是线程不同步的,它基于TreeMap的NavigableSet实现,TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序(默认是升序)。底层数据结构为:二叉树。使用它可以从Set中提取有序的序列。 
  • LinkedHashSet:哈希表和链表实现的集合接口,具有HashSet的查询速度,且内部使用链表(双向链表)维护元素的顺序(插入的次序),于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

 List列表

List的特征是其元素以线性方式存储,集合中可以存放重复对象。 List接口主要实现类包括:(参考文章:ArrayList与LinkedList的区别

  • ArrayList() : 底层是数组,代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。因为要移动数组 

                      默认长度为0,第一次add的时候设置初始容量为10,超过10的话会扩容为原来的1.5倍+1,也就是15.+1 

  • LinkedList(): 在实现中采用双向链表数据结构。插入和删除速度快,访问速度慢。 
  • Vector(): 跟ArrayList类似,不同于ArrayList的是,vector是线程安全的(线程同步),实现同步需要花费一些时间,因此效率要低于ArrayList。

                    默认长度为0,第一次add的时候设置初始容量为10,超过10会扩容为原来的2倍,也就是20.

对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。

Map(映射)

Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。 

  • HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。初始容量16,负载因子为0.75,插入第13个元素时发生扩容,扩容为原来的2倍
  • LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。 
  • TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序优先由Comparabel或Comparator决定,如果没有传入Comparator 默认按照key升序排序)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

Map各个子类详解↓↓↓

 LinkedHashMap为什么能实现有序?

 排序原理:LinkedHashMap复写了HashMap的newNode(hash, key, value, null) 方法,

由源码可知,put第一次的时候 tail 和 head 都赋值为第一次put的数据,从第二个开始每次都将 tail(尾) 设置 为当前值,同时记录before(前一个数据)是谁并通知前一个数据记录它的后一个数据为自己,以此类推。。。我们只需要知道head(头)是谁,就能知道下一个是谁,tail(尾)为最后一个数据。

举例:我们依次插入A、B、C三个数据

1、插入 A 用户,设置 tail 和 head 为 A。

2、插入 B 用户,设置 tail 为 B,记录B的Before(前一个)数据为 A,通知前一个数据 A,叫 A 记录它的 After(后一个)数据为 B。

3、以此类推  。。。 

当我们查看数据的时候可以根据他们的链式关系知道先后顺序:A -> B -> C

区别

容器内每个为之所存储的元素个数不同。
Collection类型者,每个位置只有一个元素。
Map类型者,持有 key-value pair,像个小型数据库。

猜你喜欢

转载自blog.csdn.net/qq_43037478/article/details/112439992
今日推荐