九、Map接口和常用方法

news2024/9/25 19:19:11

文章目录

  • 框架
  • 特点
  • 常用方法
  • 六大遍历方式
  • 练习

框架

在这里插入图片描述

  1. 数据是K-V类型的
  2. 我们之前学的几个Set底层也是封装了Map,但是Value部分用默认值,我们只使用Key部分

特点

注意:这里讲的是JDK8的Map接口特点

  1. Map用于保存具有映射关系的数据:Key-Value
  2. Map 中的key 和 value可以是任何引用类型的数据,会封装到HashMap$Node对象中
  3. Map 中的key 不允许重复,原因和HashSet一样,前面分析过源码。(重复添加会替换掉原来Key对应的value)
  4. 存入和取出顺序不一定一样即无序。
  5. Map 中的value可以重复
  6. Map的key可以为null,value也可以为null,注意key为null,只能有一个,value 为null ,可以多个
  7. 常用String类作为Map的key,但不限于
  8. key 和 value 之间存在单向一对一关系,即通过指定的key总能找到对应的value
  9. Map存放数据的key-value示意图,一对k-v是放在一个Node中的,有因为Node实现了 Entry 接口,有些书上也说一对k-v就是一个Entry,如图:在这里插入图片描述
    • k-v最后是存放在 HashMap$Node node = newNode(hash,key,value,null)里面
    • k-v为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素的类型Entry,而一个Entry对象就有k,v。EntrySet<Entry<K, V>>即: transient Set<Wap.Entry<K,V>> entrySet。这个集合里面的K,V分别是指向HashMap$Node node里面的数据。
    • 这个EntrySet集合可以这么理解:拿到HashMap$Node node里面的key组成一个Set集合,拿到node里面的value组成一个Collection集合,然后对应的key和value组成一个Entry存放在EntrySet中。EntrySet里面的数据只是单纯的指向并没有新的数据。
    • entrySet 中,定义的类型是 Map.Entry,但是实际上存放的还是HashMap&Node。那为什么可以当成Map.Entry存放呢,实际上这个HashMap&Node implements Map.Entry在这里插入图片描述
    • 为什么还要把HashMap&Node放在EntrySet中呢?因为 Map.Entry提供了重要方法K getKey和V getValue()。方便遍历

常用方法

  1. put:添加
  2. remove:根据键删除映射关系
  3. get:根据键获取值
  4. size:获取元素个数
  5. isEmpty:判断个数是否为
  6. clear:清除
  7. containsKey:查找键是否存在
    详细内容:https://www.runoob.com/java/java-map-interface.html

六大遍历方式


import java.util.*;


public class Test  {
    @SuppressWarnings({"all"})
    public static void main(String[] args) throws InterruptedException {
        Map map = new HashMap();
        map.put("no1",1);
        map.put("no2",212);
        map.put("no3",11);
        map.put("no4",212);
        map.put("no5",112);
        map.put("no6",1232);



        //第一组遍历方式,根据得到的key,
        Set set = map.keySet();
        // (1)增强for得到value
        for (Object o : set) {
            System.out.println(o+"--"+map.get(o));
        }
        // (2)迭代器得到value
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next+"--"+map.get(next));

        }



        //第二组遍历方式,得到所有的value,
        Collection values = map.values();
        // (1)增强for
        System.out.println("---取出所有的value增强for----");
        for (Object value : values) {
            System.out.println(value);
        }
        // (2)迭代器
        System.out.println("---取出所有的value迭代器----");
        Iterator iterator2 = values.iterator();
        while (iterator2.hasNext()) {
            Object value = iterator2.next();
            System.out.println(value);
        }


        //第三组遍历方式,通过EntrySet 来获取K-V
        Set entrySet = map.entrySet();
        // (1) 增强for
        for (Object entry :entrySet) {
            //entry转成Map.entry
            Map.Entry m = (Map.Entry) entry;
            System.out.println(m.getKey() + "-" + m.getValue());
        }
        // (2)迭代器
        Iterator iterator3 = entrySet.iterator();
        while (iterator3.hasNext()) {
            Object next = iterator3.next();
            Map.Entry m = (Map.Entry) next;
            System.out.println(m.getKey() + "-" + m.getValue());
        }

    }
}

练习

使用HashMap添加3个员工对象,要求:(健:员工id—值:员工对象)
并遍历显示工资>18000的员工(遍历方式最少两种员工类:姓名、工资、员工id)


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class Emp{
    private long id;
    private String name;
    private int salary;

    public Emp(long id, String name, int salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }
}

public class Test {
    @SuppressWarnings({"all"})
    public static void main(String[] args) throws InterruptedException {
        Map map = new HashMap();
        map.put(1,new Emp(1,"Tom",100000));
        map.put(2,new Emp(2,"Jim",30000));
        map.put(3,new Emp(3,"Potte",9000));
        map.put(4,new Emp(4,"Kim",80000));

        //方式一:得到key,增强for得到value
        Set set = map.keySet();
        for (Object o : set) {
            Emp emp = (Emp)map.get(o);
            if (emp.getSalary()>18000)
                System.out.println(o+"-"+emp);
        }

        //方式二:得到entrySet,遍历数据
        Set entrySet = map.entrySet();
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            Map.Entry entry = (Map.Entry)next;
            System.out.println(entry.getKey()+"-"+entry.getValue());
        }
    }
}

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

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

相关文章

c++类和对象

二、c类和对象 1.什么是类 c当中类是一个数据类型&#xff0c;封装了数据以及操作。个人理解&#xff1a;c类就是对事物的的抽象&#xff0c;c万物即可为类&#xff0c;和c语言的结构体一样&#xff0c;是一系列事物的共同属性和行为 2.什么是对象 对象就是类的具体化(实例化)…

git创建远程分支并关联本地分支

场景一&#xff1a; 本地、远程都没有分支 "v1.0.0" 1. 先查看确认一下&#xff0c;命令&#xff1a; git branch -a 2. 创建本地分支&#xff0c;命令&#xff1a; git checkout -b v1.0.0 3. 创建远程分支&#xff0c;并且本地分支关联远程分支&#xff0c;命令…

上海亚商投顾:沪指缩量跌0.44% 医药股全线反弹

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪大小指数今日走势分化&#xff0c;沪指全天弱势震荡&#xff0c;创业板指盘中涨超1%&#xff0c;午后涨幅有所回落。…

2022-12-29 驱动-IO多路复用

IO多路复用的原理&#xff1a; 1>select和poll原理&#xff1a;将文件描述符添加到集合中&#xff0c;监测是否有准备就绪的文件描述符&#xff0c;将未准备就绪的文件描述符剔除集合&#xff0c;准备就绪的文件描述符实现相关操作 2>对于epoll函数原理&#xff1a;创建…

超融合一体流式引擎,打造分布式数据库新纪元

12月28日&#xff0c;“数智驱动 全栈赋能”亚信科技2022年度系列产品发布会“数据库专场”线上成功举办&#xff0c;亚信科技重磅发布“超融合一体流式引擎”的AntDB V7.2数据库&#xff0c;并分享了在通信、交通等行业的应用实践。 百行千业数智化转型风起云涌&#xff0c;企…

布局云计算的下一个主场,紫光云引领行业云三大趋势

早在2018年&#xff0c;中国信通院发布2018云计算白皮书并指出&#xff1a;行业云时代全面开启。4年后的2022年底&#xff0c;Gartner将行业云平台列入2023年十大战略技术趋势&#xff0c;Gartner预测到2027年将有超过50%的企业使用行业云平台加速其业务项目。可以说&#xff0…

数据结构----树

树的概念 1.树的定义&#xff1a;树是n(n>0)个结点的有限集合 当n0时&#xff0c;称为”空树“ 当n>0时&#xff0c;有且仅有一个称为”根“的特定结点&#xff0c;该结点没有前驱&#xff0c;但是却有一个或者多个后继结点。 除了根节点以外的n-1个结点可划分为多个有…

项目管理范围(下)

创建WBS 什么是WBS&#xff1f; WBS(Work Breakdown Structure) --- 工作分解结构 创建WBS是将项目的可交付成果和项目工作分解成较小的&#xff0c;更易于管理的组件的过程。 它包含哪些内容&#xff1f; 举例&#xff1a; 里程碑的例子&#xff1a;比如需求评审&#xff…

计算机SCI论文润色,更容易被录用吗? - 易智编译EaseEditing

SCI论文润色后投稿&#xff0c;相较于没有润色投稿&#xff0c;确实概率要大一些。 特别有些英语水平较差的作者&#xff0c;投稿的论文&#xff0c;没有润色之前&#xff0c;可能审稿人会不理解&#xff0c;或读不通。 润色后&#xff0c;可能帮助审稿人理解论文。 目前不少…

告别动态规划

一、动态规划的三大步骤 动态规划&#xff0c;无非就是利用历史记录&#xff0c;来避免我们的重复计算。而这些历史记录&#xff0c;我们得需要一些变量来保存&#xff0c;一般是用一维数组或者二维数组来保存。下面我们先来讲下做动态规划题很重要的三个步骤 第一步骤&#…

九、树结构基础

1、为什么需要树这种数据结构&#xff1f; 数组存储方式的分析 优点&#xff1a;通过下标方式访问元素&#xff0c;速度快。对于有序数组&#xff0c;还可使用二分查找提高检索速度。 缺点&#xff1a;如果要检索具体某个值&#xff0c;或者插入值(按一定顺序)会整体移动&…

简单BGP实验

&#xff08;我这里AS1 BGP为100 AS2BGP为200 AS3 BGP为300&#xff09; 这里已经配置好ip环回&#xff08;这里tcp使用的是rip也已经提前配置好&#xff09; 首先先配置AS2中的ibgp [r2]bgp 200 [r2-bgp]router-id 2.2.2.2 [r2-bgp]peer 4.4.4.4 as-number 100 [r2-bgp]…

白话初识UDP协议

UDP是什么 UDP是一个传输层的数据包装协议&#xff0c;特点有&#xff1a; 无连接&#xff08;不需要两端连通就可以发送消息给接收端&#xff09;不可靠传输&#xff08;无法知道数据是否送达&#xff09;面向数据报&#xff08;以数据报为数据传输单位&#xff09;全双工&…

vue项目cli2 升级 cli3

vue-cli2 升级 vue-cli3 由于vue-cli2 版本太低&#xff0c;升级到vue-cli3 采用的方法是新建cli3项目&#xff0c;对比差异&#xff0c;在cli2项目单独升级 检查环境 node环境检查版本是否在8.11版本以上 npm uninstall vue-cli -g 卸载旧版本的vue-cli npm install -g vue/…

广州蓝景分享—VSCode 前端开发必备插件推荐

Hello~~各位小伙伴好&#xff0c;今天广州蓝景整理一波前端开发必备插件&#xff0c;绝对可以提高你的生产力&#xff0c;希望这篇文章对大家有所帮助。 开发综合推荐 别名路径跳转 插件名&#xff1a;别名路径跳转 使用说明: 别名路径跳转插件&#xff0c;支持任何项目&…

BrightlyPro - 照片视屏后期自动调色增亮工具

BrightlyPro - 照片视屏后期自动调色增亮工具 BrightlyPro 自动增强您的照片和视频&#xff0c;你最需要它。通过一个滑块&#xff0c;BrightlyPro 立即使您的照片自适应地亮起来&#xff0c;同时保持光影之间令人愉悦的平衡&#xff0c;而不会扭曲已经点亮的区域。 下载 ➤ …

day07 面向对象

1. 类和对象 **面向对象和面向过程的思想对比 : ** ​ **面向过程 &#xff1a;**是一种以过程为中心的编程思想&#xff0c;实现功能的每一步&#xff0c;都是自己实现的 ​ **面向对象 &#xff1a;**是一种以对象为中心的编程思想&#xff0c;通过指挥对象实现具体的功能…

Java开发学习(三十四)----Maven私服(二)本地仓库访问私服配置与私服资源上传下载

一、本地仓库访问私服配置 我们通过IDEA将开发的模块上传到私服&#xff0c;中间是要经过本地Maven的 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码 私服中的仓库很多&#xff0c;Maven最终要把资源上传到哪个仓库? Maven下载的时候&#xff0c;又需要携带用…

Nginx限制每秒请求次数,限制每秒连接次数,下载速度限制

Hi I’m Shendi 为了防止网站被恶意攻击&#xff0c;总是需要做一些防护措施 最外层的web服务器是Nginx&#xff0c;于是寻找 nginx 的一些关于防护措施的配置&#xff0c;记录在此 https://sdpro.top/blog/html/article/1005.html 一些变量 首先列举出会使用到的一些变量 …

XXEXML漏洞详解

XXE&XML漏洞详解1.XML基础1.1.XML基础介绍1.2.XML文档结构1.3.DTD介绍1.4.实体类介绍1.5.外部实体2.XXE漏洞基本介绍2.1.XXE漏洞基本概念2.2.XXE漏洞危害2.3.XXE漏洞输出形式2.4.XXE漏洞相关差异3.XXE漏洞测试3.1.有回显测试3.1.1.有回显案例3.1.1.1.测试回显位置3.1.1.2.构…