双列集合 Map常见的API Map遍历方式 HashMap LinkedHashMap treeMap

news2024/11/25 22:58:33

目录

  • 双列集合
    • 双列集合的特点
  • 双列集合体系结构
  • Map常见的API
  • Map遍历方式
    • Map的遍历方式一(键找值)
    • 遍历方式二键值对
    • 遍历方式三lambda表达式
  • HashMap
    • 练习1
    • 练习二
    • LinkedHashMap
    • TreeMap
      • TreeMap练习1

双列集合

在这里插入图片描述

双列集合可以记录两个元素.一个称为键一个称为值.合称为键值对,又叫键值对对象,又叫Entry

双列集合的特点

在这里插入图片描述

双列集合体系结构

在这里插入图片描述
有体系结构知Map是最顶层

Map常见的API

在这里插入图片描述

 public static void main(String[] args) {



        //创建map集合

        Map<String,String>m=new HashMap<>();


        //添加元素

        m.put("小诗时","小丹丹");
        m.put("小帆帆","小丽丽");
        m.put("张三","小未未");

       // String s = m.put("小帆帆", "李四");
        //System.out.println(s);

        //添加了相同的键
        //{张三=小未未, 小诗时=小丹丹, 小帆帆=李四}
        //这里只打印了小帆帆 李四 因为put的底层是在建制存在时 后加的会把原来的覆盖

        //并且第二个键值对象会返回第一个被覆盖的对象 这里是小丽丽
        //如果没有被覆盖的键值会返回null



        //remove根据键值删除对应元素

        //m.remove("小诗时");
        //System.out.println(m);//{张三=小未未, 小帆帆=小丽丽}




        //m.clear();//{}清除所有


        // m.containsKey判断集合是否包含指定的键
        boolean b = m.containsKey("小诗时");
        System.out.println(b);
        //true
        //{张三=小未未, 小诗时=小丹丹, 小帆帆=小丽丽}


        boolean b1 = m.containsValue("小未未");
        System.out.println(b1);//true


        //判断集合是否为空
        boolean b2 = m.isEmpty();
        System.out.println(b2);//false


        //判断有几个键值对
        int size = m.size();
        System.out.println(size);//3


        //打印集合
        System.out.println(m);
    }

Map遍历方式

Map的遍历方式一(键找值)

在这里插入图片描述

解析:把键和值分开,键放在一个单例集合里遍历然后通过get方法获取值值

public static void main(String[] args) {
        //Map集合的一种遍历
        Map<String,String>m=new HashMap<>();


        m.put("小诗时","小丹丹");
        m.put("小帆帆","小丽丽");
        m.put("张三","小未未");

        //通过键找值

        Set<String> keys = m.keySet();//这个方法可以理解为将key放到了一个Set集合里

       // System.out.println(key);//[张三, 小诗时, 小帆帆]


        //这个就是装着键的单列集合
        //遍历单列集合,得到每一个键
        for (String key : keys) {


            //通过刚刚的map集合传入键,通过键找到值
            String value = m.get(key);
            System.out.println(key+"="+value);

        }
        //小未未
        //小丹丹
        //小丽丽

        System.out.println("___________________");
        //迭代器遍历

        Iterator<String> it = keys.iterator();

        while(it.hasNext()){
            String s = it.next();
            String value2 = m.get(s);
            System.out.println(value2);
        }


        System.out.println("______________");

        //lambda遍历

        keys.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                String s3 = m.get(s);
                System.out.println(s3);
            }
        });

    }

遍历方式二键值对

原理:利用map集合调用方法entrySet()这个方法相当于获取每个键值对对象并存储在一个Set集合里

 public static void main(String[] args) {

        Map<String,String> m=new HashMap<>();


        m.put("小诗时","小丹丹");
        m.put("小帆帆","小丽丽");
        m.put("张三","小未未");


        Set<Map.Entry<String, String>> entries = m.entrySet();
        //entries相当于所有键值对对象
        for (Map.Entry<String, String> entry : entries) {
            //循环获取每个键值对对象

            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"="+value);
        }
//张三=小未未
//小诗时=小丹丹
//小帆帆=小丽丽
            System.out.println("______________________");
            //迭代器遍历
            Iterator<Map.Entry<String, String>> it = entries.iterator();
            while(it.hasNext()){
                Map.Entry<String, String> next = it.next();
                //迭代器获取了每个键值对对象

                String key1 = next.getKey();
                String value1 = next.getValue();
                System.out.println(key1+"="+value1);




            }


        System.out.println("______________");
        //lambda遍历

        entries.forEach(new Consumer<Map.Entry<String, String>>() {
            @Override
            public void accept(Map.Entry<String, String> stringStringEntry) {
                String key2 = stringStringEntry.getKey();
                String value2 = stringStringEntry.getValue();
                System.out.println(key2+"="+value2);


            }

        });

        }

遍历方式三lambda表达式

他的底层是一个增强for就是利用第二种方式调用

  public static void main(String[] args) {



        Map<String,String> m=new HashMap<>();


        m.put("小诗时","小丹丹");
        m.put("小帆帆","小丽丽");
        m.put("张三","小未未");


        m.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key+"="+value);
            }
        });


        //lambda
        m.forEach((key, value)-> System.out.println(key+"="+value));








    }

HashMap

在这里插入图片描述

他是Map的实现类所以它可以用Map的方法
在这里插入图片描述
在底层创建按一个HashMap对象的时候他还是会创建一个默认长度为16加载因子为0.75的数组利用put方法就会创建数据了
put方法底层首先创建一个entry对象,他里面添加的就是键和值,然后利用键 计算键的哈希值,只要键的哈希值即可,然后再计算出再数组中应存入的索引,如果该位置为null直接添加,如果该位置不是null并且已经存入了元素,它会调用equals方法比教键的属性值,如果键比较相同会覆盖原有的,如果比较不一样直接添加元素挂在老元素下形成一条链表.链表长度超过8并且数组长度>=64自动转成红黑树

在这里插入图片描述

练习1

需求创建一个集合对象 键是学生对象 值是籍贯
存储三个键值对元素 并遍历
要求同姓名年龄为同一个学生

 public static void main(String[] args) {

        //创建学生对象

        Student s1=new Student("李磊",18);
        Student s2=new Student("张三",10);
        Student s3=new Student("李四",12);
        Student s4=new Student("李四",12);


        //Student{name = 李磊, age = 18}=山东
        //Student{name = 张三, age = 10}=河南
        //Student{name = 李四, age = 12}=江苏
//打印结果如上 因为重复的被覆盖了

        //创建集合
        HashMap<Student,String>hp=new HashMap<>();

        hp.put(s1,"山东");
        hp.put(s2,"河南");
        hp.put(s3,"郑州");
        hp.put(s4,"江苏");


        //匿名内部类遍历
        hp.forEach(new BiConsumer<Student, String>() {
            @Override
            public void accept(Student student, String s) {
                System.out.println(student+"="+s);
            }
        });

        System.out.println("_______________");
        //键找值遍历

        Set<Student> keySet = hp.keySet();
        //获取了键的对象
        for (Student student : keySet) {
            //一次遍历获得每个键


            //通过传入键找到值
            String value = hp.get(student);
            System.out.println(student+"="+value);


        }

        System.out.println("_______________");
        //键值对遍历

        Set<Map.Entry<Student, String>> entries = hp.entrySet();
        //获取一个键值对

        for (Map.Entry<Student, String> entry : entries) {
            //获取每个一次遍历
            Student key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"="+value);
        }
    }

核心:HashMap的键位置如果是存储自定义学生对象 需要重写hashCode和equals方法

练习二

在这里插入图片描述

像这种要统计的集合比较多不确定有多少种的时候可以用map集合,这里的景点数量就是个不确定的数

思路 用键存储景点名称值存储景点位置

public static void main(String[] args) {


        //定义四个景点存储在一个数组内
        String arr[]={"A","B","C","D"};

        ArrayList<String>list=new ArrayList<>();

        //写一个集合模拟80人投票结果
        Random r=new Random();
        for (int i = 0; i < 80; i++) {

            int index = r.nextInt(arr.length);
            //获取随机索引
            //System.out.println(arr[index]);

            //吧随即索引添加列表中存储
            list.add(arr[index]);

        }


        //创建一个hashMap集合 键存储景点 值存储次数

        HashMap<String,Integer>hp=new HashMap<>();
        for (String name : list) {//遍历得到每次投票信息 景点名


            //判断当前景点再map集合是否存在
            if(hp.containsKey(name)){
                //存在
                //先获取当前经典的已有次数
                Integer value = hp.get(name);
                value++;
                //把信息信息传递给map
                hp.put(name,value);


            }else{
                //不存在


                hp.put(name,1);

            }


        }
        System.out.println(hp);



        //判断哪个景点想去的人最多

        int max=0;
        //解析景点投票可能出现有些经典很多人有些很少但也
        //会出现有些很多有些是0人

        //遍历得到每个键值对

        Set<Map.Entry<String, Integer>> entries = hp.entrySet();

        for (Map.Entry<String, Integer> entry : entries) {

            Integer value = entry.getValue();
            if(value>max){
                max=value;
            }

        }
        System.out.println(max);


        for (Map.Entry<String, Integer> entry : entries) {

            Integer value = entry.getValue();
            if(value==max){

                System.out.println(entry.getKey());
            }


        }

    }

LinkedHashMap

在这里插入图片描述

  public static void main(String[] args) {

        LinkedHashMap<String,Integer>lhm=new LinkedHashMap<>();

        lhm.put("a",123);
        lhm.put("a",234);
        lhm.put("b",154);
        lhm.put("c",123);
        
        //{a=234, b=154, c=123} 键不能重复 还会覆盖

        System.out.println(lhm);
    }

TreeMap

在这里插入图片描述

TreeMap练习1

在这里插入图片描述

TreeMap<Integer,String>tm=new TreeMap<>();
        //默认按照键的排序方式
        //而Integer排序方式是按照第一种排序方式默认升序


        tm.put(5,"可乐");
        tm.put(4,"雪碧");
        tm.put(3,"冰红茶");
        tm.put(2,"奶茶");
        tm.put(1,"香蕉");


        System.out.println(tm);

如果确实想实现按逆序排列只能采用比较器

   TreeMap<Integer,String>tm=new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        //默认按照键的排序方式
        //而Integer排序方式是默认升序


        tm.put(5,"可乐");
        tm.put(4,"雪碧");
        tm.put(3,"冰红茶");
        tm.put(2,"奶茶");
        tm.put(1,"香蕉");


        System.out.println(tm);
        //{5=可乐, 4=雪碧, 3=冰红茶, 2=奶茶, 1=香蕉}

在这里插入图片描述
运行报错:是因为自定义对象排序需要指定排序规则

遇到这样的题应该如何选择集合
如果题目中没有要求对结果进行排序默认使用HashMap
如题目中要求对结果进行排序 请使用TreeMap

 public static void main(String[] args) {


        //要求利用map集合统计aababcabcdabcde
        //键表示要统计的内容
        //值表示次数



        //:思路先拆分字符串
        //拿到字符串然后与集合联动 看看再集合中存在否 不存在的话put一个新的存在的话count++


        TreeMap<Character,Integer>tm=new TreeMap<>();
        String s="aababcabcdabcde";
        for (int i = 0; i < s.length(); i++) {
            char c=s.charAt(i);//取除每一个字符串

            //把字符串存入集合 如果在集合中已经存在count++次数
            //如果不存在直接put
            if(tm.containsKey(c)){
                //拿出value已有次数
                int count=tm.get(c);
                count++;

                //把自增后的结果添加集合
                tm.put(c,count);


            }else{
                tm.put(c,1);


            }



        }
        System.out.println(tm);
        //{a=5, b=4, c=3, d=2, e=1}

        //我们想要的格式为a(5)b(4)....

        //可以使用StringBuilder拼接

        StringBuilder sb=new StringBuilder();

        //打印集合
        tm.forEach(new BiConsumer<Character, Integer>() {
            @Override
            public void accept(Character key, Integer value) {
                sb.append(key).append("(").append(value).append(")");
                
            }
        });
        System.out.println(sb);
        //a(5)b(4)c(3)d(2)e(1)
        
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos7防火墙开启端口

1.查看防火墙状态 firewall-cmd --state如果返回的not running&#xff0c;那么需要先开启防火墙 2.开启关闭防火墙 systemctl start firewalld.service systemctl stop firewalld.service systemctl restart firewalld.service3.开放指定端口 firewall-cmd --zonepublic -…

支持Upsert、Kafka Connector、集成Airbyte,Milvus助力高效数据流处理

Milvus 已支持 Upsert、 Kafka Connector、Airbyte&#xff01; 在上周的文章中《登陆 Azure、发布新版本……Zilliz 昨夜今晨发生了什么&#xff1f;》&#xff0c;我们已经透露过 Milvus&#xff08;Zilliz Cloud&#xff09;为提高数据流处理效率&#xff0c; 先后支持了 Up…

利大于弊:物联网技术对电子商务渠道的影响

For Better or For Worse: Impacts of IoT Technology in e-Commerce Channel 物联网技术使用传感器和其他联网设备来手机和共享数据&#xff0c;并且被视为一种可以为供应链成员带来巨大的机会的突破性技术。本文的研究背景是&#xff1a;一个提供物联网基础设备的电子商务平…

【问题总结】Docker环境下,将Nacos版本2.0.4升级到2.2.3,操作留档 以及 踩坑记录

前记&#xff0c;鉴于nacos暴露的验证鉴权bug&#xff08;之前尝试解决但是没有完全解决&#xff01;&#xff0c;需要对公司之前架构留下来的老版本nacos进行升级 参考资料&#xff1a; https://nacos.io/zh-cn/blog/announcement-token-secret-key.html https://nacos.io/…

LLM之Agent(四)| AgentGPT:一个在浏览器运行的Agent

AgentGPT是一个自主人工智能Agent平台&#xff0c;用户只需要为Agent指定一个名称和目标&#xff0c;就可以在浏览器中链接大型语言模型&#xff08;如GPT-4&#xff09;来创建和部署Agent平台。 PS&#xff1a;目前agentGPT仅支持chatgpt模型&#xff0c;暂时不支持本地llm模…

AI生成视频-Pika

背景介绍 Pika 是一个使用 AI 生成和编辑视频的平台。它致力于通过 AI 技术使视频制作变得简单和无障碍。 Pika 1.0 是 Pika 的一个重大产品升级&#xff0c;包含了一个新的 AI 模型,可以在各种风格下生成和编辑视频,如 3D 动画&#xff0c;动漫&#xff0c;卡通和电影风格。…

香港云服务器计算型和通用型的区别

在当今数字化时代&#xff0c;云服务器作为企业级应用的核心设备&#xff0c;其性能和类型对于企业的运营和数据处理至关重要。在常见的香港云服务器类型中&#xff0c;通用型和计算型是最为常见的两种。那么&#xff0c;这两种云服务器到底有什么区别呢? 设计目标和应用场景不…

【4】PyQt输入框

1. 单行文本输入框 QLineEdit控件可以输入单行文本 from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import * from PyQt5.QtGui import QIcon import sysdef init_widget(w: QWidget):# 修改窗口标题w.setWindowTitle(单行输…

Object Detection in 20 Years: A Survey(2019.5)

文章目录 Abstract1. Introduction1.1. Difference from other related reviews1.2. Difficulties and Challenges in Object Detection 2. OBJECT DETECTION IN 20 YEARS2.1. 目标检测路线图2.1.1. 里程碑:传统探测器&#xff08;粗略了解&#xff09;2.1.2. 里程碑:基于CNN的…

新华三数字大赛复赛知识点 SSH

SSH作用、特点、原理、配置 SSH&#xff08;Secure Shell&#xff0c;安全外壳&#xff09;是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录和文件传输方式&#xff0c;例如Telnet、FTP&#xff0c;使用明文传输数据&#xff…

【Erlang进阶学习】1、递归和模式匹配

在erlang程序开发中&#xff0c;模式匹配和递归是很重要的两种操作&#xff0c;说他俩是平时开发工作中的两个“核心”也不为过。 1、递归&#xff1a;用来迭代或重复某种行为&#xff0c;效果类比for循环。 2、模式匹配&#xff1a;在erlang程序中&#xff0c;大量的使用到“…

华容道问题求解第一部分_思路即方案设计

一、前言 华容道是一种传统的益智游戏&#xff0c;通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块&#xff08;也称为车块&#xff09;和其他大小相同的方块&#xff08;也称为障碍块&#xff09;。游戏的目标是将车块从木板的一个端点移动到另一个…

深度学习在计算机视觉中的应用

深度学习在计算机视觉中的应用 摘要&#xff1a;本文介绍了深度学习在计算机视觉领域的应用&#xff0c;包括目标检测、图像分类、人脸识别等。通过分析深度学习在计算机视觉中的实际应用案例&#xff0c;阐述了深度学习在计算机视觉中的优势和未来发展趋势。 一、引言 计算…

【go-zero】go-zero使用ent框架 如何使用源生sql完成查询

背景 本篇教程我们采用的是go-zero的快速脚手架工具 simple-admin 框架的开发 github地址:https://github.com/suyuan32/simple-admin-core 因为框架推荐使用Ent 这篇教程我们则对Ent的基本使用的几种形式进行一个总结 一、开启ent的源生sql 1、simple-admin生成rpc 【go-…

字符集——带你了解UTF-8的前世今生

文章目录 字符集的来历汉字和字母的编码特点Unicode字符集字符集小结编码和解码开发约定 字符集的来历 计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一…

从0开始学Spring、Springboot总结笔记(持续更新中~)

文章目录 一.基于SpringBoot进行Web开发入门1.IDEA编译器中创建springboot工程扩展&#xff1a;如何解决pom.xml文件中“找不到Maven插件”的问题&#xff1f; 2.Springboot项目如何编写请求类和请求方法并启动访问编写请求类和请求方法启动Springboot访问 一些学习资源参考 一…

【无标题】从0到1 搭建一个vue3+Django项目

目录 一、后端项目python django二、前端项目vitevue3三、后端配置3.1 将路由指向app3.2 app下创建urls.py&#xff0c; 写入路由3.3 views写入test函数3.4 启动服务&#xff0c;访问路由 四、前端配置4.1 安装一些工具库及创建文件4.1.1 安装需要用的三方库4.1.2 创建文件 4.2…

ActiveMQ 反序列化漏洞(CVE-2015-5254)

ActiveMQ 反序列化漏洞 Apache ActiveMQ是一种开源的消息代理&#xff08;message broker&#xff09;&#xff0c;被广泛用于应用程序之间的消息传递。它提供可靠的消息传递模式&#xff0c;如发布/订阅、点对点和请求/响应&#xff0c;非常适合构建分布式系统和应用程序集成…

沐风老师3DMAX键盘球建模方法详解

3DMAX键盘球建模教程 本教程给大家分享一个3dMax键盘球的建模方法过程。在学习本教程之前&#xff0c;大家需要对3dMax基本操作及建模知识有所掌握&#xff0c;还是那句话&#xff1a;做实例的前提是选学习基础知识和掌握3dMax的基本操作。 下面就给大家一步一步讲解演示3dMax…

Avalonia框架下面使用Prism框架实现MVVM模式

前言 默认情况下&#xff0c;使用Avalonia模板创建的Avalonia项目自带了Mvvm框架&#xff0c;其实用着也蛮好用的&#xff0c;但是前期在WPF开发中习惯了使用Prism框架&#xff0c;所以今天我们就来研究一下如何在Avalonia项目里面引入Prism框架来提高开发效率。 创建Avaloni…