关系图
图来自https://www.cnblogs.com/wuyuegb2312/p/4458468.html
Map
Map接口: 除了定义基本操作,还包含了返回包含所有key的Set (Key不能重复)、包含所有value的collection的方法。如果用一个可变对象作为Map的key,若key值变化影响到了equals(),会导致Map行为不确定。Map接口中有一个内部接口Map.Entry
,定义为Entry<K,V>,表示Map中的一个键值对
Hashtable类: 兼容以前的代码,现在基本不使用
AbstractMap抽象类: 对Map接口进行了一些基本的实现
HashMap类: 底层用数组和链表实现的,线程不安全。允许null元素,这个key没办法做哈希值的计算,只能遍历哈希值数组,找到首元素的key为null的队列。put()、get()复杂度为O(1)。初始大小和加载因子会影响HashMap的性能。
LinkedHashMap类: 所有的Entry组成了一个双向链表(可以使用插入顺序或LRU顺序访问所有元素),插入顺序,线程不安全。LinkedHashMap不像HashMap这样无序,也不像TreeSet会带来额外的开销
WeakHashMap类: 与HashMap类似,其内部包含了一个ReferenceQueue,并且它的Entry是继承自WeakReference的。通过这种方式,在clear()、resize()、size()、getTable()时,都会调用expungeStaleEntries()方法,垃圾回收掉不再使用的映射关系
SortedMap接口: SortedMap中的所有元素都是排过序的。这个“排序”不同于LinkedHashMap中将所有元素组织成一个链表,而是指任意任意两个元素都可以比较大小关系,并根据这个比较规则Comparator进行排序。更准确的说,是键的大小关系。
TreeMap类: 基于NavigableMap实现的红黑树,线程不安全,自动排序(自然顺序或自定顺序),不允许null
元素。get()
、put()
、containsKey()
、remove()
复杂度均为O(logN)