JDK各集合的底层实现 JDK各集合的底层实现

JDK各集合的底层实现


  • ArrayList&Vector:object数组,Vector线程安全;
  • HashMap&HashTable:哈希表,拉链法。key重复会放到链表头,且每次读取也读链表头,HashTable线程安全;
         存储时:计算key的hash,映射到Entry table[hashResult%length];有一个threshold变量,在某一链表的长度超过预设值时,会发生HashMap的扩容,捅的扩容完成后,会根据Entry.hash重新写入链表。还有一个loadfactor,装载/全部容量大于预设值,也会发生扩容。
         读取时:使用一样的算法。
JDK1.8中,对HashMap的实现做出了一些改进,比如链表的头插法改为尾插法(方便记录threshold的值);超过阈值链表改为红黑树表示。

  • HashSet:使用HashMap<E,Object>实现,存储其key,Value使用的是一个对象常量;
  • TreeMap:红黑树(一种自平衡的二叉树)实现,可保证key的有序,且不重复(因为本身就是二叉查找树,能找到的结点不会重复插入),插入/删除的时间复杂度是O(logn),非线程安全;
  • TreeSet:红黑树,有序,不重复;
  • LinkedList:object链表;
  • LinkedHashMap:继承了HashMap,但引入了一个新的数据结构,采用与HashMap一样的Entry<K,V>,但使用双向链表对其进行连接。能保证读取时FIFO。
         本质上就是HashMap+双向链表(结点为Entry)。每次put进来的Entry,除了添加到哈希表外,还要添加到双向链表中。



  • 从上面的图中,我们也看到了Map和Collection是两个不同的超级接口。要明确几点:
         ①排序是针对Collections.sort的,传入的参数必须是Collection。
         ②Map想使用排序方法,必须先通过entrySet()方法,返回由Set包装的EntrySet<K,V>对象,再在Collection视图上进行排序。
         ③迭代器也是建立在Collection基础上的,如果要对Map进行遍历,需要获取其keySet或者entrySet,在Set上获得iterator

猜你喜欢

转载自blog.csdn.net/HgH3223273424/article/details/80610413