详解LinkedHashSet和LinkedHashMap

目录

一.LinkedHashSet和LinkedHashMap

1.基本介绍

2.与HashSet和HashMap的区别

3.LinkedHashSet和LinkedHashMap具体的方法

1.LinkedHashSet

2.LinkedHashMap

二.模拟代码实现LinkedHashMap

三.具体应用


一.LinkedHashSet和LinkedHashMap

1.基本介绍

顾名思义,根据名字我们可以知道LinkedHastSet和LinkedHashMap底层是用链表实现的,具体是使用双向链表实现的,下面是继承树,LinkedHashMap继承了父类HashMap,因此HashMap中的方法,在LinkedHashMap中都是可以使用的.(LinkedHashSet一样)

2.与HashSet和HashMap的区别

我们都知道HashSet和HashMap是根据HashCode存储到具体位置,例如是求余7存储到具体的索引,那么当我们遍历时候,存储的顺序和添加的顺序是不一样的.例如如下代码执行的结果,toString打印出来的和添加的顺序不一样

HashSet<Integer> set = new HashSet<>();
set.add(1);
set.add(5);
set.add(4);
set.add(3);
System.out.println(set);//[1, 3, 4, 5]

 而LinkedHashSet底层使用链表实现的,每次添加都是尾插法进行添加,所以添加的顺序一定是和遍历的顺序是一样的(这里采用迭代器遍历)

LinkedHashSet<Integer> set1 = new LinkedHashSet<>();
set1.add(1);
set1.add(5);
set1.add(4);
set1.add(3);
Iterator<Integer> iterator = set1.iterator();
while (iterator.hasNext()){
    System.out.print(iterator.next()+"  ");//1  5  4  3 
}

3.LinkedHashSet和LinkedHashMap具体的方法

1.LinkedHashSet

具体就是以下方法,LinkedHashSet和HashSet一样,不保存值相同的元素

LinkedHashSet<Integer> set = new LinkedHashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(1);
System.out.println(set);//[1, 2, 3]
set.remove(1);//删除成功返回true,删除失败返回false
System.out.println(set);//[2, 3]
System.out.println(set.size());//2
System.out.println(set.isEmpty());//false
System.out.println(set.contains(2));//true

2.LinkedHashMap

LinkedHashMap<Integer,String> map=new LinkedHashMap<>();
map.put(1,"1");
map.put(2,"2");
map.put(3,"3");
System.out.println(map);//{1=1, 2=2, 3=3}
map.remove(1);
System.out.println(map);//{2=2, 3=3}
System.out.println(map.size());//2
map.put(1,"10");
System.out.println(map);//{2=2, 3=3, 1=10}
System.out.println(map.containsKey(1));//true
System.out.println(map.containsValue("10"));//true

二.模拟代码实现LinkedHashMap

这里我们为了方便,就没有采用泛型来定义.用了HashMap来存储键和对应的Node结点,这样根据键就可以找到对应的Node在LinkedHashMap中的位置,并且添加的时候和遍历的顺序也是一致的,这是一种比较好理解的LinkedHashMap的实现方式.链表这里我们采用了双向链表的存储方式,结点存储key和value,并且结点的key和HashMap的key是一一对应的.

public class LinkedHashMap extends LinkedList {

    //HashMap的键(key)和LinkedList的Node的键相互对应
    HashMap<Integer, Node> map;
    LinkedList list;

    public LinkedHashMap() {
        map = new HashMap<>();
        list = new LinkedList();
    }

    public void addLast(int key, int val) {
        Node x = new Node(key, val);
        list.addLast(x);
        map.put(key, x);

    }

    public void remove(int key) {
        Node x = map.get(key);
        list.remove(x);
        map.remove(x);

    }


    public int size() {
        return list.size();
    }
    public boolean containsKey(int key){
        return map.containsKey(key);
    }

}


class LinkedList {
    class Node {
        public int key, val;
        public Node next, prev;

        public Node(int key, int val) {
            this.key = key;
            this.val = val;
        }
    }

    //头尾虚拟节点
    private Node head, tail;
    //链表元素数
    private int size;

    public LinkedList() {
        head = new Node(0, 0);
        tail = new Node(0, 0);
        head.next = tail;
        tail.prev = head;
        size = 0;
    }

    public void addLast(Node x) {
        x.prev = tail.prev;
        x.next = tail;
        tail.prev.next = x;
        tail.prev = x;
        size++;
    }

    public void remove(Node x) {
        x.prev.next = x.next;
        x.next.prev = x.prev;
        size--;
    }

    public Node removeFirst() {
        //空链表
        if (head.next == tail) {
            return null;
        }
        Node first = head.next;
        remove(first);
        return first;
    }

    public int size() {
        return size;
    }
}

三.具体应用

具体在实现LRU缓存淘汰算法上有应用,只要就是应用的LinkedHashMap的存储的顺序和添加的顺序是一样的特性,我们对于不经常使用的数据进行淘汰处理,这个时候我们需要确保存储的顺序和添加的顺序保持一致性,也就是当内存满了之后,先添加的进行淘汰,具体的讲解明天进行博客的更新!!!!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gpt4国内可以使用吗-chatgpt国内使用的软件排行榜

gpt4国内怎么用&#xff1f; 目前 OpenAI 尚未正式发布 GPT-4 模型&#xff0c;因此目前尚无法直接使用它。预计当GPT-4发布时&#xff0c;将通过OpenAI平台提供API以供使用者调用&#xff0c;同时新的API接口可能需要在不同国家/地区进行不同程度的注册或许可等手续。 当Ope…

php 修改服务器文件上传大小限制

输入docker cp mlfnginx:/etc/nginx/conf.d/pl.conf .输入vimpl.conf 修改nginx配置文件移动到图中所示位置client_max_body_size 按键盘”i”对图中的xxM修改成需要的大小&#xff0c;然后按”esc”&#xff0c;在按”:wq”&#xff0c;最后按回车键输入docker cp ./pl.con…

寻找2020 (蓝桥杯) JAVA

题目描述 小蓝有一个数字矩阵&#xff0c;里面只包含数字0 和2。小蓝很喜欢2020&#xff0c;他想找到这个数字矩阵中有多少个2020 。 小蓝只关注三种构成2020 的方式&#xff1a; 同一行里面连续四个字符从左到右构成2020。 同一列里面连续四个字符从上到下构成2020。 在一条从…

南京邮电大学通达学院《数学实验》MATLAB实验答案

南京邮电大学通达学院《数学实验》MATLAB实验答案一 声明二 MATLAB下载三 南京邮电大学通达学院《数学实验》练习一1.11.21.31.41.51.61.71.81.91.101.11![请添加图片描述](https://img-blog.csdnimg.cn/a3d3a094f6ea4dff85c0fd0bf40bbb44.jpeg)四月维夏&#xff0c;六月徂暑。…

百度文心一言可以完胜ChatGPT的4点可能性

文心一言&#xff0c;百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。但说实话&#xff0c;很多人拿他与ChatGPT相对比&#x…

项目经理注意!掌握这5个关键点,提升效率80%!

很多项目在刚接手时&#xff0c;遇到的问题种类多并且复杂&#xff0c;乍一看很令人头疼&#xff0c;但仔细梳理下来好像也没有那么难&#xff0c;只需要厘清以下5个关键点&#xff1a; 一、做好项目的五个关键 具体的思路就是: 明确事->找对人->排计划->定机制->…

Bulk vector export as SLD and GeoJson

QGIS插件&#xff0c;可以导出所有图层的GeoJson数据格式和SLD图层样式文件。 缺点&#xff1a;导出的文件名和图层名称不对应。

数据结构与算法:滑动窗口类题目总结

滑动窗口类型题目解题框架总结&#xff1a; class Solution:def problemName(self, s: str) -> int:# Step 1: 定义需要维护的变量们 (对于滑动窗口类题目&#xff0c;这些变量通常是最小长度&#xff0c;最大长度&#xff0c;或者哈希表)x, y ..., ...# Step 2: 定义窗口…

Node.js学习笔记——Node.js模块化

一、介绍 1.1.什么是模块化与模板&#xff1f; 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为模块化。 其中拆分出的每个文件就是一个模块&#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他模块…

【树与二叉树】二叉树顺序结构实现以及堆的概念及结构--详解介绍

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1. 二叉树顺序结构2.…

Elasticsearch:Elasticsearch 容量规划

Elasticsearch 是一个可扩展的分布式系统&#xff0c;可为企业搜索、日志聚合、可观察性和安全性提供解决方案。 Elastic 解决方案建立在一个单一、灵活的技术堆栈之上&#xff0c;可以部署在任何地方。 要在自托管或云端运行生产环境 Elasticsearch&#xff0c;需要规划基础架…

Linux硬链接与软链接

图示区别 硬链接 具有相同inode节点号的多个文件互为硬链接文件&#xff1b;删除硬链接文件或者删除源文件任意之一&#xff0c;文件实体并未被删除&#xff1b;只有删除了源文件和所有对应的硬链接文件&#xff0c;文件实体才会被删除&#xff1b;硬链接文件是文件的另一个入…

贯穿设计模式第四话--里氏替换原则

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 从今天开始&#xff0c;将…

关于位运算的巧妙性:小乖,你真的明白吗?

一.位运算的概念什么是位运算&#xff1f;程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。位运算就是直接操作二进制数&#xff0c;那么有哪些种类的位运算呢&#xff1f;常见的运算符有与(&)、或(|)、异或(^)、…

软硬结合板设计,过孔到软板区域的间距设计多少合适

一博高速先生成员&#xff1a;王辉东 十里樱花香无边&#xff0c; 满枝芳华尽娇艳。 春风不知少年心&#xff0c; 红粉树下看如烟。 周六的下午&#xff0c;赵理工推开窗&#xff0c;一阵香风袭来&#xff0c;空气中氤氲着樱花的气息。樱花开得浪漫&#xff0c;恰似少年的…

[致敬未来的攻城狮计划 1] 使用 “FSP Configuration”(FSP 配置)透视配置器设置运行环境

开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客专家 架构师李肯&#xff08;http://yyds.recan-li.cn&#xff09;和 瑞萨MCU &#xff08;瑞萨电子 (Renesas Electronics Corporation) &#xff09; 联合发起的「 致敬未来的攻城狮计划 」的第 4 天&#xff0c;点击…

动态规划-不相交的线

动态规划-不相交的线 前言 动态规划中存在一类问题&#xff0c;它涉及到两个数组或链表&#xff0c;需要求解出两个数组中的最长公共子序列&#xff0c;如果要求解两个数组的最长公共子序列。如果采取最原始的方式&#xff0c;选择对第一个数组中的元素的不同排列进行有序组合…

Excel:vlookup函数

Excel:VlookUp函数VlookUp函数VlookUp函数 首先还是先放官方文档的参考&#xff1a;VLOOKUP 函数 Vlookup函数参数&#xff1a; VLOOKUP(lookup_ value, table_ array, col index_ num, [range_ lookup]) lookup_ value&#xff1a;要查找的内容&#xff1b; table_ array&a…

CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

目录 一、概述二、插件制作三、Cmake编译四、插件代码五、结果展示一、概述 手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。 二、插件制作 1、将....\plugins\example路径下的ExamplePlugin复制一份并修改名字为CCPointCloudProcess。 …

大数据之Spark基础环境

文章目录前言一、Spark概述&#xff08;一&#xff09;Spark是什么&#xff08;二&#xff09;Spark的四大特点&#xff08;三&#xff09;Spark的风雨十年&#xff08;四&#xff09;Spark框架模块&#xff08;五&#xff09;Spark通信框架总结前言 #博学谷IT学习技术支持# 本…