首页 > 其他分享 >简单说说HashMap和LinkedHashMap的区别

简单说说HashMap和LinkedHashMap的区别

时间:2023-05-06 16:24:10浏览次数:26  
标签:map aaa accessOrder 区别 Entry LinkedHashMap HashMap

HashMap和LinkedHashMap的区别

我们知道HashMap的变量顺序是不可预测的,这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的。这个特性通常会对我们的工作造成一定的困扰。为了实现这个功能,我们可以使用LinkedHashMap。

LinkedHashMap详解

先看下LinkedHashMap的定义:

public class LinkedHashMap<K,V>

    extends HashMap<K,V>

    implements Map<K,V>

LinkedHashMap继承自HashMap,所以HashMap的所有功能在LinkedHashMap都可以用。

LinkedHashMap和HashMap的区别就是新创建了一个Entry:

    static class Entry<K,V> extends HashMap.Node<K,V> {

        Entry<K,V> before, after;

        Entry(int hash, K key, V value, Node<K,V> next) {

            super(hash, key, value, next);

        }

    }

这个Entry继承自HashMap.Node,多了一个before,after来实现Node之间的连接。

通过这个新创建的Entry,就可以保证遍历的顺序和插入的顺序一致。

下面看一个LinkedHashMap插入的例子:

@Test

    public void insertOrder(){

        LinkedHashMap<String, String> map = new LinkedHashMap<>();

        map.put("ddd","desk");

        map.put("aaa","ask");

        map.put("ccc","check");

        map.keySet().forEach(System.out::println);

    }

输出结果:

ddd

aaa

ccc

可以看到输出结果和插入结果是一致的。

除了遍历的顺序,LinkedHashMap还有一个非常有特色的访问顺序。

我们再看一个LinkedHashMap的构造函数:

public LinkedHashMap(int initialCapacity,

                         float loadFactor,

                         boolean accessOrder) {

        super(initialCapacity, loadFactor);

        this.accessOrder = accessOrder;

    }

前面的两个参数initialCapacity,loadFactor我们之前已经讲过了,现在看最后一个参数accessOrder。

当accessOrder设置成为true的时候,就开启了 access-order。

access order的意思是,将对象安装最老访问到最新访问的顺序排序。我们看个例子:

@Test

    public void accessOrder(){

        LinkedHashMap<String, String> map = new LinkedHashMap<>(16, .75f, true);

        map.put("ddd","desk");

        map.put("aaa","ask");

        map.put("ccc","check");

        map.keySet().forEach(System.out::println);

        map.get("aaa");

        map.keySet().forEach(System.out::println);

    }

输出结果:

ddd

aaa

ccc

ddd

ccc

aaa

我们看到,因为访问了一次“aaa“,从而导致遍历的时候排到了最后。

removeEldestEntry

最后我们看一下LinkedHashMap的一个特别的功能removeEldestEntry。这个方法是干什么的呢?

通过重新removeEldestEntry方法,可以让LinkedHashMap保存特定数目的Entry,通常用在LinkedHashMap用作缓存的情况。

removeEldestEntry将会删除最老的Entry,保留最新的。

ublic class CustLinkedHashMap<K, V> extends LinkedHashMap<K, V> {

 

    private static final int MAX_ENTRIES = 10;

 

    public CustLinkedHashMap(

            int initialCapacity, float loadFactor, boolean accessOrder) {

        super(initialCapacity, loadFactor, accessOrder);

    }

 

    @Override

    protected boolean removeEldestEntry(Map.Entry eldest) {

        return size() > MAX_ENTRIES;

    }

}

看上面的一个自定义的例子,上面的例子我们创建了一个保留10个Entry节点的LinkedHashMap。

LinkedHashMap继承自HashMap,同时提供了两个非常有用的功能。

 

 

标签:map,aaa,accessOrder,区别,Entry,LinkedHashMap,HashMap
From: https://www.cnblogs.com/bk6601/p/17377772.html

相关文章

  • vue v-bind与v-model的区别
    1.v-bind是单向绑定,用来绑定数据和属性以及表达式,数据只能从data流向页面;v-model是双向绑定,数据能从data流向页面,也能从页面流向data。2.v-bind可以给任何属性赋值,v-model只能给表单类,也就是具有value属性的元素进行数据双向绑定,如input、text、radio、checkbox、selected。可以......
  • Hashtable、synchronizedMap、ConcurrentHashMap 深度比较
    关键字:Hashtable、synchronizedMap、ConcurrentHashMap深度比较util.concurrent包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型List和Map的高性能的、线程安全的实现。BrianGoetz向您展示了用ConcurrentHashMap替换Hashtable或synchro......
  • 负载均衡和反向代理的区别
    Client和负载均衡设备之间的报文交互过程RS和负载均衡设备之间的报文交互过程结果分析:TCP握手过程:同反向代理模式交互过程HTTP报文交互过程:    Client向负载均衡设备的VIP地址172.16.75.84以源IP10.8.21.40发送HTTP请求,当负载均衡设备收到报文后,与优选后的RS进行TCP三......
  • APP和WEB的测试区别
    在功能测试时,要考虑手机应用的特性:1)手机屏幕尺寸偏小,所以手机应用一般就占满了全屏,因此要考虑手机在前后端切换时被测试应用在资源使用时的优先级变化情况;还要考虑手机横竖屏切换时的测试2)手机是智能移动终端,因此要考虑网络运营商、网络信号强弱、网络信号有无、被测试应用在低电......
  • float和double有什么区别
    https://baijiahao.baidu.com/s?id=1717564367074475880&wfr=spider&for=pcfloat和double有什么区别: float:单精度浮点数。 double:双精度浮点数。 两者的主要区别如下: 01.在内存中占有的字节数不同 单精度浮点数在机内存占4个字节。 双精度浮点数在机......
  • oracle中int类型和number类型区别
    oracle中int类型和number类型区别 INT类型是NUMBER类型的子类型。下面简要说明:(1)NUMBER(P,S)该数据类型用于定义数字类型的数据,其中P表示数字的总位数(最大字节个数),而S则表示小数点后面的位数。假设定义SAL列为NUMBER(6,2)则整数最大位数为4位(6-2=4),而小数最大位数为2位。(2)INT类型当定......
  • AD和LDAP的区别
    LDAP是轻量目录访问协议(LightweightDirectoryAccessProtocol)的缩写,LDAP标准实际上是在X.500标准基础上产生的一个简化版本AD是Active Directory的缩写,AD应该是LDAP的一个应用实例,而不应该是LDAP本身。比如:windows域控的用户、权限管理应该是微软公司使用LDAP存储了一些数......
  • C# Lambda表达式select()和where()的区别
    1、where()用法:必须加条件,且返回对象结果。string[]arrays={"asd","abc","bbb","ccc"};varresults=arrays.Where(a=>a.Contains("b"));//必须加条件,返回对象2、select()用法:(1)(a=>a.Value=="22")加条件查询时,返回bool型结果;(2)(a=......
  • Ganymed-SSH2和JSch的区别及优缺点
    Ganymed-SSH2和JSch都是Java中用于实现SSH客户端的库。下面是它们的区别及优缺点:区别:Ganymed-SSH2:Ganymed-SSH2是一款轻量级的SSH-2实现,它提供了简单易用的API,支持SSH客户端和服务器端的开发。Ganymed-SSH2主要使用纯Java编写,可以在所有支持Java的平台上运行,不需要任何本地库或......
  • npx与npm的区别,使用npx的好处
     什么是NPX?一个npm包执行器,指在提高从npm注册表使用软件包时的体验NPX是NPM包的执行者。最初,NPX于2017年7月推出.NPX只是一个可以像其他NPM软件包一样安装的NPM软件包。目前,在安装NPM5.2.0或更高版本时,NPX与NPM捆绑在一起。 使用NPX使用NPX,您可以运行和执行软件包,而无需......