标签:容量 cap 分享 因子 ash 不同 插入 空间 shm
LinkedHashMap是HashMap的子类,它可以依照插入的顺序来存储元素,LinkedHashMap的存储结构采用了双重链表,因此元素的增加、修改和删除效率都比较高。
一、存储结构
从图中可以看出,LinkedHashMap和HashMap的存储结构基本相同,都是数组+链表。唯一不同的是,链表节点有两个指针,分别是before和after,指向该节点的直接后继和直接前驱,再通过双向链表表头节点,就可以实现从双向链表中的任意一个节点开始,很方便地访问它的前驱节点和后继节点。
LinkedHashMap采用的hash算法和HashMap相同,但它扩展了Entry。LinkedHashMap中的Entry增加了before和after两个指针,用于维护双向链表。图中的next指针用于维护Map中各个Entry的连接顺序,before、after用于维护Entry插入的先后顺序。
二、构造函数
LinkedHashMap提供了5个构造函数,它们都是在HashMap的构造函数的基础上实现的,分别如下:
1.LinkedHashMap()
用于构造默认存储元素容量为16,、负载因子为0.75的LinkedHashMap对象。其中容量为可存储元素的初始长度,负载因子表示散列表空间的使用程度,负载因子越大则散列表就能容纳更多的元素,存储的元素过多,索引效率就会降低。
2.LinkedHashMap(int initialCapacity, float loadFactor)
用于构造指定初始容量和负载因子的LinkedHashMap对象。
3.LinkedHashMap(int initialCapacity)
用于构造指定初始容量、负载因子默认为0.75的LinkedHashMap对象。
4.LinkedHashMap(Map m)
用于构造指定具有相同Map的LinkedHashMap对象,该对象初始容量依赖于传入Map的容量,负载因子默认为0.75。
5.LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
用于构造指定容量、负载因子、迭代顺序的LinkedHashMap对象。
三、遍历
同HashMap相同,LinkedHashMap也不能用迭代器、foreach等方法遍历。如果需要遍历LinkedHashMap,可以通过如下方法:
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("A", "张三");
map.put("B", "李四");
map.put("C", "王五");
// 遍历
Set<Entry<String, Object>> set = map.entrySet();
Iterator<Entry<String, Object>> iter = set.iterator();
while(iter.hasNext()) {
Entry<String, Object> entry = iter.next();
String key = entry.getKey();
Object val = entry.getValue();
System.out.println(key + " " + val);
}
标签:容量 cap 分享 因子 ash 不同 插入 空间 shm
原文地址:https://www.cnblogs.com/yuanfei1110111/p/10187515.html