草庐IT

LinkedHashSet和LinkedHashMap手记

风澜舞 2023-04-17 原文

LinkedHashSet和LinkedHashMap

这两个类维护一个双向链表,可以记住插入元素的顺序。

实例:LinkedHashMap

可以使用访问顺序来迭代处理映射条目,当get或者put访问元素时,受影响的条目从当前位置删除,然后放到末尾,只影响链表,不影响散列表的桶。

LinkedHashMap<K,V>(initialCapacity, loadFactor,true) //构造访问顺序迭代处理的Map

这样的好处是,可以保持”最近最少使用原则“,这样当容器满的时候可以通过覆盖removeEldestEntry来删掉前面的很少使用的缓存,。

// 定义一个容量为10,装填因子为0.75,访问顺序的cache,
// 当size/容量>装填因子时,散列表就会再次散列。
var cache = new LinkedHashMap<String,Integer>(10, 0.75F, true){
    // 复写该方法,则会删除掉Map中最不常访问的元素。
    protected boolean removeEldestEntry(Map.Entry<String,Integer> eldest){
        // 当容器的内容>5时删掉最不常访问的元素
        return size() > 5;
    }
};

cache.put("zs", 1);
cache.put("ls", 2);
cache.put("ww", 2);
cache.put("zs",3);  // 对张s进行覆盖,则会出现在最后访问之后

cache.forEach((k,v)->{
    System.out.println(k+":"+v);
});

/*
		ls:2
        ww:2
        zs:3


		*/
System.out.println("================");
cache.put("ml", 1);
cache.put("zl", 3);
cache.forEach((k,v)->{
    System.out.println(k+":"+v);
});
/*此时Map的size已经到5,添加一个元素后,将最不常访问到的第一个元素删除
		ls:2
        ww:2
        zs:3
        ml:1
        zl:3
		*/
System.out.println("***************");
cache.put("lll", 4);
cache.forEach((k,v)->{
    System.out.println(k+":"+v);
});
/*
		ww:2
        zs:3
        ml:1
        zl:3
        lll:4
		*/

有关LinkedHashSet和LinkedHashMap手记的更多相关文章

  1. 随手记3:C#Unity中随机数的使用 - 2

    问题:在同时引用UnityEngine和System命名空间时【usingUnityEngine(继承MonoBehaviour类+)+usingSystem(用到了浮点数转字符串的Convert函数)】,如果直接Random.Range(float1float2)会出现“Random”是“UnityEngine.Random”和“System.Random”之间的不明确的引用的报错解决方法:在前面加上到底使用哪个Random,即UnityEngine.Random.Range(float1float2)或者先System.Randomr=newSystem.Random();再调用r.Nex

  2. 手记系列之四 ----- 关于使用MySql的经验 - 2

    前言本篇文章主要介绍的关于本人在使用MySql记录笔记的一些使用方法和经验,温馨提示,本文有点长,约1.5w字,几十张图片,建议收藏查看。一、MySql安装下载地址:https://dev.mysql.com/downloads/在安装MySql之前,查看是否以及安装过MySql,如果已经安装,但是不符合要求的话就卸载。如果是windows安装的话,下载windows的安装包,一路next下去,设置好账号和密码就行了。1,查找以前是否装有mysql先输入:rpm-qa|grep-imysql查看是否安装了mysql2,停止mysql服务、删除之前安装的mysql输入:ps-ef|grepmys

  3. 【AI训练新手记:如何通过ChatGPT生成令人惊艳的文案!】 - 2

    【我】:我是一名Youtuber,工作内容是写吸引人的youtube脚本,并拍摄上传,我的领域是技术型频道,请你告诉我10个chatgpt相关的吸引人的选题【ChatGPT】:当然,下面是10个有关技术的ChatGPT相关的吸引人选题,它们可以帮助你制作出有趣且有价值的YouTube视频:未来科技趋势:ChatGPT如何改变我们的世界?ChatGPT是如何学习和理解人类语言的?探索自然语言处理技术ChatGPT3.5是什么?深入了解自然语言生成的最新进展如何使用ChatGPT来自动生成文章和新闻报道?如何使用ChatGPT来生成诗歌、小说和散文?ChatGPT能否取代人类作家?对文学创作的影响

  4. java - LinkedHashMap 内存消耗 - 2

    用户上传了一个包含100万字的巨大文件。我解析文件并将文件的每一行放入LinkedHashMap.我需要O(1)的key访问和删除。此外,我需要保留访问顺序,从任何位置迭代并排序。内存消耗巨大。我启用了Stringsdeduplicationfeature它出现在Java8中,但事实证明LinkedHashMap消耗大部分内存。我发现LinkedHashMap.Entryconsumes40bytes,但只有2个指针-一个用于下一个条目,一个用于前一个条目。我认为1个指针应该是64位或32位。如果我将409,405,320(字节)除以6,823,422(条目数),则购买我每个条目有60

  5. java - C# 等效于 LinkedHashMap - 2

    这个问题在这里已经有了答案:LinkedHashMapin.NET(8个答案)关闭6年前。如问题所述,我正在寻找与Java中的LinkedHashMap等效的c#。我需要能够通过索引检索键和值,获取大小。我需要按照插入的方式对元素进行排序。一个键应恰好与一个值匹配。我尝试过的集合(以及它们的问题):NameValueCollection-允许一对多链接。我猜这会导致不必要的开销。OrderedDictionary-无法通过索引检索键。编辑:有人指出,在C#中不存在这样的等价物。在链接的问题中,答案指向一个示例实现的论坛,该论坛似乎已关闭。有人可以在这里提供示例实现吗?编辑2:Syste

  6. java - 对具有相同值的键进行排序 -->LinkedHashMap - 2

    我用Java编写了单词程序,并得出了单词和频率列表。结果当前存储在LinkedHashMap中。结果如下所示:garden-->2road-->4street-->5park-->5highway-->5在上面的结果集中,存储在LinkedHashMap中,如何排序才能只对具有相同频率的键进行排序。我们仍然希望保持给定的频率顺序。结果看起来像这样:garden-->2road-->4highway-->5park-->5street-->5谢谢。 最佳答案 我能够以类似于Boris建议的答案的方式完成此操作。但是,我使用的任何IDE

  7. java - 为什么 LinkedHashSet 的 boolean accessOrder 设置为 false - 2

    在Java中,LinkedHashSet是通过支持HashSet创建的,使用以下LinkedHashMap构造函数创建LinkedHashMapmap=newLinkedHashMap(initialCapacity,loadFactor);此时在LinkedHashMap中,依次调用上面的构造函数publicLinkedHashMap(intinitialCapacity,floatloadFactor){super(initialCapacity,loadFactor);accessOrder=false;}那么有什么方法可以将accessOrder设置为true的LinkedHa

  8. java - linkedhashmap如何维护插入顺序 - 2

    我知道Hashmap的内部工作原理。Linkedhashmap扩展了Hashmap类。那么Linkedhashmap是如何维护插入顺序的呢。我已经阅读了Linkedhashmap的javadoc,但没有关于此的任何详细信息。有人可以帮我理解这个吗?提前致谢。 最佳答案 http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html.实现背后的想法非常简单。它扩展了常规hashMap(因此它具有所有hashMap优点),但在添加元素时也构建双链表。(条目也是从

  9. java - TreeSet 与 LinkedHashSet 和 TreeMap 相比 LinkedHashMap 增加了多少成本? - 2

    LinkedHashSet-此实现使其客户免受HashSet提供的未指定的、通常困惑的排序的影响,而不会导致与TreeSet相关的成本增加。关于LinkedHashMap与TreeMap的说法相同增加的成本(LinkedHashMap与TreeMap)究竟是多少?这是否意味着TreeSet每个元素需要更多内存?LinkedHashSet需要更多的内存用于两个额外的链接,但是TreeSet需要额外的内存来存储Map.Entry对元素(因为隐式基于TreeMap),此外LinkedHashSet基于HashMap也有Map.Entry对元素开销......所以区别在于添加新元素的速度有多快

  10. java - LinkedHashMap 的 keySet() 和 values() 方法的行为 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:IstheorderguaranteedforthereturnofkeySet()ofaLinkedHashMapobject?假设我创建了一个LinkedHashMap,如下所示:Mapmap=newLinkedHashMap();map.put("a","aa");map.put("b","bb");map.put("c","cc");当我调用keySet()时,它会给我一个有序集吗?如果我调用values(),这些也是有序的吗?编辑Sry,意思是有序的,不是有序的。

随机推荐