首页 > 其他 > 详细

Map接口及其实现类

时间:2021-01-11 18:27:47      阅读:37      评论:0      收藏:0      [点我收藏+]

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;Map中的键值对以Entry类型的对象实例形式存在;

键(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个键最多只能映射到一个值。

Map及其实现类类图关系如下:

技术分享图片

HashMap

HashMap一般作为Map接口的主要实现类来使用,它的key和value允许为null,key值不允许重复,所以key值最多只有一个null值,在源码中定义了

DEFAULT_INITIAL_CAPACITY = 1 << 4;//初始化默认值为1<<4,即16
static final int MAXIMUM_CAPACITY = 1 << 30//默认最大容量为1<<30
static final float DEFAULT_LOAD_FACTOR = 0.75f;//默认负载因子为0.75
static final int TREEIFY_THRESHOLD = 8;//桶的树化阈值:即链表转成红黑树的阈值,在存储数据时,当链表长度 > 8时,则将链表转换成红黑树
static final int UNTREEIFY_THRESHOLD = 6;//当在扩容(resize())时(此时HashMap的数据存储位置会重新计算),在重新计算存储位置后,当原有的红黑树内数量 < 6时,则将 红黑树转换成链表
static final int MIN_TREEIFY_CAPACITY = 64;//最小树化容量阙值,即 当哈希表中的容量 > 该值时,才允许树形化链表 (即 将链表 转换成红黑树)否则,若桶内元素太多时,则直接扩容,而不是树形化,为了避免进行扩容、树形化选择的冲突,这个值不应小于 4 * TREEIFY_THRESHOLD

 

HashMap底层实现在1.7之前为数组加链表,即计算出每个Entry<K,V>对象对应的hash值,并把Entry对象放入对应的数组下标中,如果发生了Hash碰撞,会使用链地址法,把新传入的Entry对象设为头用next指向链表中的下一个Entry。

在1.8之后变为数组加链表加红黑二叉树,即为一个链表的长度如果大于TREEIFY_THRESHOLD 并且tab数组的容量大于等于64时,链表会转化为红黑二叉树。

默认扩容机制:如果当前容量大于数组容量*默认负载因子则直接*2,默认长度为16,如果是通过HashMap(int initialCapacity)设置初始容量时,HashMap会自动计算出第一个大于该数的2的幂,并把这个值返回作为数组的初始长度。

HashMap是线程不安全的,如果想使用线程安全的HashMap可以使用Collections工具类中的synchronizedMap()方法,这个方法会返回一个线程安全的Map类,实现上在调用map所有方法时,都对整个map进行同步。

HashMap的构造方法共有4个,可以指定HashMap的数组长度(并不能),负载因子,还可以传入一个Map<? extends K, ? extends V> m。

Hashtable

Hashtable底层是一个哈希表,它是一个线程安全的集合,单线程集合,速度慢,Hashtable集合不能存储null值,null键。Hashtable单线程场景下性能不如HashMap,多线程场景下性能不如ConcurrentHashMap。

Hashtable集合逐渐被HashMap集合取代,但是Hashtable的子类Properties依然沿用,Properties集合也是唯一一个和IO流相结合的集合。

LinkedHashMap
LinkedHashMap是一个有序的Map,它虽然增加了时间和空间上得开销,但是通过维护一个运行于所有条目的双向链表,LinkedHashMap得以做到有序,这点有点类似于LinkedHashSet。
LinkedHashMap的Key值和Value值都允许为空,但是多个key值为空会覆盖。
LinkedHashMap通过在Entry中新增了Entry<K,V>before,Entry<K,V>after来保证了Entry插入顺序的先后。
TreeMap
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
TreeMap类似于TreeSet可以对存入其中的数据的Key进行自然排序或者根据其创建时所指定的Comparator进行排序,具体取决于它的构造方法。
TreeMap的构造方法:

// 默认构造函数。使用该构造函数,TreeMap中的元素按照自然排序进行排列。
TreeMap()

// 创建的TreeMap包含Map
TreeMap(Map<? extends K, ? extends V> copyFrom)

// 指定Tree的比较器
TreeMap(Comparator<? super K> comparator)

// 创建的TreeSet包含copyFrom
TreeMap(SortedMap<K, ? extends V> copyFrom)


 


Map接口及其实现类

原文:https://www.cnblogs.com/codeZn/p/14258771.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!