美团Hashmap详细好文 https://tech.meituan.com/2016/06/24/java-hashmap.html
image.png

Collection

  • Set

SetTreeSet: 基于红黑树实现,支持有序性操作
HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作,遍历结果是随机的
LinkedHashSet:具有HashSet的查找效率,且内部使用双向链表维护元素的插入顺序

  • List

ArrayList:基于动态数组实现,支持随机访问
Vector:和ArrayList类似,但是他是线程安全的
LinkedList:基于双向链表实现,只能顺序访问,可以快速的插入和删除元素,可以用做栈、队列、双向队列

  • Queue

LinkedList:可以用它实现双向队列
PriorityQueue:基于堆结构实现,可以用它来实现优先队列

Map

TreeMap:基于红黑树实现
HashMap:基于哈希表实现
HashTable:线程安全的,和HashMap类似,但是现在应该使用ConcurrentHashMap来支持线程安全,ConcurrentHashMap效率更高,因为引入了分段锁
LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序,或者LRU

HashMap和HashTable的区别

  1. HashMap线程不安全,HashTable内部使用synchronized锁,线程安全
  2. HashMap的效率比HashTable高,因为HashTable内部做了线程安全的处理
  3. 对Null key和Null value的支持,HashMap支持一个Null key,多个Null Value;而HashTable不支持Null key和Null Value
  4. 初始容量和扩容机制的不同。HashMap初始容量默认是16,扩容是扩容到2n的大小;HashTable默认是11,扩容是扩容到2n+1;当指定容量时,HashMap会将指定的容量扩充到2的幂次方,HashTable会直接使用给定的容量
  5. 底层数据结构。HashMap当链表长度大于8时,会自动转换为红黑树