LinkedHashMap特性 按插入和访问顺序排序
来源:互联网 发布:北京淘宝培训班 编辑:程序博客网 时间:2024/05/17 16:46
LinkedHashMap的特性:
Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元素被访问的顺序。利用这个线性结构的对象,可以帮助记录entry加入的前后顺序或者记录entry被访问的频率(最少被访问的entry靠前,最近访问的entry靠后)。大致的过程如下:
new LinkedHashMap(10, 0.75, true);
其中前面两个参数就是HashMap构造函数需要的参数,后面的true表明LinkedHashMap按照访问的次序来排序。
按照访问的次序来排序的含义:当调用LinkedHashMap的get(key)或者put(key, value)时,碰巧key在map中被包含,那么LinkedHashMap会将key对象的entry放在线性结构的最后。
按照插入顺序来排序的含义:调用get(key), 或者put(key, value)并不会对线性结构产生任何的影响。
正是因为LinkedHashMap提供按照访问的次序来排序的功能,所以它才需要改写HashMap的get(key)方法(HashMap不需要排序)和HashMap.Entry的recordAccess(HashMap)方法
public Object get(Object key) {
Entry e = (Entry)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;
}
void recordAccess(HashMap m) {
LinkedHashMap lm = (LinkedHashMap)m;
if (lm.accessOrder) {
lm.modCount++;
remove();
addBefore(lm.header);
}
至于put(key, value)方法, LinkedHashMap不需要去改写,用HashMap的就可以了,因为HashMap在其put(key, value)方法里边已经预留了e.recordAccess(this);
还有一个方法值得关注:
protected booleanremoveEldestEntry(Map.Entry eldest) {
return false;
结果是:
key0
key1
key2
key3
key4
key5
key6
key7
key8
key9
2. 查询时,把最新查出来的元素放在末位(原因上面已经解释为啥放在队尾了)
结果是:
key0
key1
key2
key4
key5
key6
key7
key8
key9
key3
Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元素被访问的顺序。利用这个线性结构的对象,可以帮助记录entry加入的前后顺序或者记录entry被访问的频率(最少被访问的entry靠前,最近访问的entry靠后)。大致的过程如下:
new LinkedHashMap(10, 0.75, true);
其中前面两个参数就是HashMap构造函数需要的参数,后面的true表明LinkedHashMap按照访问的次序来排序。
按照访问的次序来排序的含义:当调用LinkedHashMap的get(key)或者put(key, value)时,碰巧key在map中被包含,那么LinkedHashMap会将key对象的entry放在线性结构的最后。
按照插入顺序来排序的含义:调用get(key), 或者put(key, value)并不会对线性结构产生任何的影响。
正是因为LinkedHashMap提供按照访问的次序来排序的功能,所以它才需要改写HashMap的get(key)方法(HashMap不需要排序)和HashMap.Entry的recordAccess(HashMap)方法
public Object get(Object key) {
Entry e = (Entry)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;
}
void recordAccess(HashMap m) {
LinkedHashMap lm = (LinkedHashMap)m;
if (lm.accessOrder) {
lm.modCount++;
remove();
addBefore(lm.header);
}
}
至于put(key, value)方法, LinkedHashMap不需要去改写,用HashMap的就可以了,因为HashMap在其put(key, value)方法里边已经预留了e.recordAccess(this);
还有一个方法值得关注:
protected booleanremoveEldestEntry(Map.Entry eldest) {
return false;
}
当调用put(key, value)的时候,HashMap判断是否要自动增加map的size的作法是判断是否超过threshold, LinkedHashMap则进行了扩展,
如果removeEldestEntry方法return false;(默认的实现),那么LinkedHashMap跟HashMap处理扩容的方式一致;
如果removeEldestEntry返回true,那么LinkedHashMap会自动删掉最不常用的那个entry(也就是header线性表最前面的那个)。
正如LinkedHashMap的文档所说,LinkedHashMap简直就是为了实现LRU Cache(Least Recently Used)而编写的。正因为如此,在oscache或者是ehcache都使用到了LinkedHashMap。(oscache中是否使用LRU是可以配置的)。
下面是LinkedHashMap的Java用法:
1. 保持放入元素先后的顺序不变化:
- import java.util.LinkedHashMap;
- import java.util.Map;
- public class TestLinkedMap {
- public static void main(String[] args) {
- Map<String, String> map = new LinkedHashMap<String, String>();
- for (int i = 0; i < 10; i++) {
- map.put("key" + i, "value" + i);
- }
- map.get("key" + 5);
- for (String value : map.keySet()) {
- System.out.println(value);
- }
- }
- }
结果是:
key0
key1
key2
key3
key4
key5
key6
key7
key8
key9
2. 查询时,把最新查出来的元素放在末位(原因上面已经解释为啥放在队尾了)
- import java.util.LinkedHashMap;
- import java.util.Map;
- public class TestLinkedMap {
- public static void main(String[] args) {
- Map<String, String> map = new LinkedHashMap<String, String>(16, 0.75f, true);
- for (int i = 0; i < 10; i++) {
- map.put("key" + i, "value" + i);
- }
- map.get("key" + 3);
- for (String value : map.keySet()) {
- System.out.println(value);
- }
- }
- }
结果是:
key0
key1
key2
key4
key5
key6
key7
key8
key9
key3
阅读全文
0 0
- LinkedHashMap 特性 按插入和访问顺序排序
- LinkedHashMap特性 按插入和访问顺序排序
- LinkedHashMap特性 按插入和访问顺序排序
- LinkedHashMap特性 按插入和访问顺序排序
- LinkedHashMap特性 按插入和访问顺序排序
- LinkedHashMap特性 按插入和访问顺序排序
- LinkedHashMap类-和插入顺序强相关
- 使用LinkedHashMap可以实现按照插入的顺序进行排序
- LinkedHashMap(按访问顺序的链表)实现Lru
- LinkedHashMap 根据PUT顺序排序Map
- LinkedHashMap 根据PUT顺序排序Map
- LinkedHashMap和TreeMap排序实现
- 插入排序顺序倒序
- LinkedHashMap保证MAP按照插入的顺序输出
- HashMap和LinkedHashMap的存取顺序问题
- python实现插入排序算法的顺序和倒序
- LinkedHashMap按存放顺序迭代
- LinkedHashMap 排序
- Windows编程实现俄罗斯方块
- document对象
- 关于QTableWidget使用setCellWidget嵌入控件错位的问题
- LeapMotion Demo2
- request 方法详解
- LinkedHashMap特性 按插入和访问顺序排序
- 折半插入排序算法
- 程序员面试(0):关于i++,++i,printf的例题
- 前端判断img是否加载
- SVN服务器搭建和使用(二)
- 安卓基础1:安卓基础提要、拨号器及布局
- layer.open iphone里页面卡死的问题
- UIMotionEffect和Home页背景视差效果
- 18.四数相加与目标值相等的组合