“LinkedHashMap”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
第50行: 第50行:
 
key:lemon,value:柠檬
 
key:lemon,value:柠檬
 
</syntaxhighlight>可以发现,元素添加的顺序和取出的顺序一致
 
</syntaxhighlight>可以发现,元素添加的顺序和取出的顺序一致
 +
 +
 +
 +
 +
=== 测试元素访问的顺序 ===
 +
被访问过的元素排在最后,这里的“被访问过”指的是通过<syntaxhighlight lang="java">
 +
    public V get(Object key) {
 +
        Node<K,V> e;
 +
        if ((e = getNode(hash(key), key)) == null)
 +
            return null;
 +
        if (accessOrder)
 +
            afterNodeAccess(e);
 +
        return e.value;
 +
    }
 +
</syntaxhighlight>方法获取过;
 +
 +
举个例子,
 +
 +
添加顺序:<"apple","苹果">,<"banana","香蕉">,<"pear","梨子">,<"grape","葡萄">,<"lemon","柠檬">
 +
 +
如果此时访问:<"apple","苹果">
 +
 +
则取出时顺序:<"banana","香蕉">,<"pear","梨子">,<"grape","葡萄">,<"lemon","柠檬">,<"apple","苹果"><syntaxhighlight lang="java">
 +
import java.util.LinkedHashMap;
 +
 +
public class LinkedHashMapTest {
 +
 +
    public static void main(String[] args) {
 +
        //创建水果集合
 +
        LinkedHashMap<String, String> fruits = new LinkedHashMap<>(16, 0.75f, true);
 +
        //添加水果
 +
        fruits.put("apple", "苹果");
 +
        fruits.put("banana", "香蕉");
 +
        fruits.put("pear", "梨子");
 +
        fruits.put("grape", "葡萄");
 +
        fruits.put("lemon", "柠檬");
 +
 +
        System.out.println("访问前:");
 +
        fruits.forEach((k, v) -> {
 +
            System.out.printf("key:%s,value:%s\n", k, v);
 +
        });
 +
 +
        fruits.get("apple");
 +
 +
        System.out.println("访问后:");
 +
        fruits.forEach((k, v) -> {
 +
            System.out.printf("key:%s,value:%s\n", k, v);
 +
        });
 +
    }
 +
 +
}
 +
</syntaxhighlight><syntaxhighlight lang="console">
 +
访问前:
 +
key:apple,value:苹果
 +
key:banana,value:香蕉
 +
key:pear,value:梨子
 +
key:grape,value:葡萄
 +
key:lemon,value:柠檬
 +
访问后:
 +
key:banana,value:香蕉
 +
key:pear,value:梨子
 +
key:grape,value:葡萄
 +
key:lemon,value:柠檬
 +
key:apple,value:苹果
 +
</syntaxhighlight>

2023年5月6日 (六) 11:26的版本

package java.util;
……
public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>
{
……
transient LinkedHashMap.Entry<K,V> head;
transient LinkedHashMap.Entry<K,V> tail;
}
生成缩略图出错:无法将缩略图保存到目标地点

结点左边的“b”是 before 的意思,是指向前驱的引用类型变量;

结点右边的“a”是 after 的意思,是指向后继的引用类型变量;

next 则是按照 hashcode 取模之后存储元素的hash槽的位置;



测试元素添加和取出的顺序

package io.github.jihch;

import java.util.LinkedHashMap;

public class LinkedHashMapTest {

    public static void main(String[] args) {
        //创建水果集合
        LinkedHashMap<String, String> fruits = new LinkedHashMap<>();
        //添加水果
        fruits.put("apple", "苹果");
        fruits.put("banana", "香蕉");
        fruits.put("pear", "梨子");
        fruits.put("grape", "葡萄");
        fruits.put("lemon", "柠檬");
        fruits.forEach((k, v) -> {
            System.out.printf("key:%s,value:%s\n", k, v);
        });
    }

}
key:apple,value:苹果
key:banana,value:香蕉
key:pear,value:梨子
key:grape,value:葡萄
key:lemon,value:柠檬

可以发现,元素添加的顺序和取出的顺序一致



测试元素访问的顺序

被访问过的元素排在最后,这里的“被访问过”指的是通过

    public V get(Object key) {
        Node<K,V> e;
        if ((e = getNode(hash(key), key)) == null)
            return null;
        if (accessOrder)
            afterNodeAccess(e);
        return e.value;
    }

方法获取过;

举个例子,

添加顺序:<"apple","苹果">,<"banana","香蕉">,<"pear","梨子">,<"grape","葡萄">,<"lemon","柠檬">

如果此时访问:<"apple","苹果">

则取出时顺序:<"banana","香蕉">,<"pear","梨子">,<"grape","葡萄">,<"lemon","柠檬">,<"apple","苹果">

import java.util.LinkedHashMap;

public class LinkedHashMapTest {

    public static void main(String[] args) {
        //创建水果集合
        LinkedHashMap<String, String> fruits = new LinkedHashMap<>(16, 0.75f, true);
        //添加水果
        fruits.put("apple", "苹果");
        fruits.put("banana", "香蕉");
        fruits.put("pear", "梨子");
        fruits.put("grape", "葡萄");
        fruits.put("lemon", "柠檬");

        System.out.println("访问前:");
        fruits.forEach((k, v) -> {
            System.out.printf("key:%s,value:%s\n", k, v);
        });

        fruits.get("apple");

        System.out.println("访问后:");
        fruits.forEach((k, v) -> {
            System.out.printf("key:%s,value:%s\n", k, v);
        });
    }

}
访问前:
key:apple,value:苹果
key:banana,value:香蕉
key:pear,value:梨子
key:grape,value:葡萄
key:lemon,value:柠檬
访问后:
key:banana,value:香蕉
key:pear,value:梨子
key:grape,value:葡萄
key:lemon,value:柠檬
key:apple,value:苹果