JavaSE-Map

news2024/12/23 13:28:03

Map集合

5.0 重点掌握

  • 能够说出Map集合的特点
  • 能够使Map集合添加方法保存数据
  • 使用“键找值””键值对“的方式遍历Map集合
  • 使用HashMap存储自定义键值对的数据
  • 完成HashMap案例

5.1 Map集合概述

现实生活中,经常会出现这么一种集合:如 身份证与个人,ip与主机名等,这种一一对应的关系,就叫做映射,

Java提供了专门的集合来存放这种对象关系映射,即java.util.Map接口

其中,Map接口和Collection接口存储数据的形式是不同的

  • Collection接口定义了单列集合规范,每次存储一个元素。Collection
  • Collection中的集合,元素是独立存在的 ( 单身狗 ),向集合中存储元素采用一个一个的方式存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQAP3Oze-1681714245811)(photo/JavaSE12_集合.assest/1671257470483.png)]

  • Map接口定义了双列集合的规范,每次存放一对元素。Map<K,V>
  • Map中的集合。元素是成对成对的 ( 小情侣 ),每个元素由键和值两部分组成,通常键可以找到指定的值,
  • Map中的集合,键是唯一的,值可以重复,每个键只能对应一个值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YNaIFqr0-1681714245812)(photo/JavaSE12_集合.assest/1671257716107.png)]

5.2 Map常用的子类

Map有多个子类,其中常用的事HashMap和LinkedHashMap

  • HashMap<K,V> : 存储数据采用的是哈希表结构,元素的存取顺序不能保持一致,由于要保证键的唯一,不重复,需要重写键的hashCode()方法、equals()方法
  • LinkedHashMap(K,V) :HashMap下的子类LinkedHashMap,存储数据采用的事哈希表+链表结构,通过链表结构可以保证元素的存储顺序一致。通过哈希表结构可以保证键的唯一和不重复。需要重写键的hashCode()方法和equals()方法

5.3 Map接口中的常用方法

Map接口中定义了很多方法:常用如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GuEq1jks-1681714245813)(photo/JavaSE12_集合.assest/1671427946747.png)]

Map接口常用方法案例

import java.util.HashMap;
import java.util.Map;

public class Demo01Map {
    /*
     Map集合的特点
         1、Map是一个双列集合,一个元素包含两个值:一个key一个value
         2、Map集合中的元素,key和value的数据类型,可以相同,也可以不同
         3、Map集合中的元素,key是不允许重复的,value是可以重复的
         4、Map集合中的元素,key和value是一一对应的
     HashMap实现了Map接口
         1、HashMap底层是哈希表,查询速度快
         2、HashMap是一个无序的集合,存储元素和取出元素的顺序可能不一致
     LinkHashMap继承自HashMap
         1、LinkHashMap集合底层是哈希表+链表,保证了迭代的顺序
         2、LinkHashMap是一个有序的集合,存储元素和取出元素的顺序是一致的
  */
    public static void main(String[] args) {
        /*
            1   将指定的值与此映射中的指定键相关联
                public V put(K key, V value)
                返回值:V
                    key不重复,返回值是null
                    key重复,原先value被覆盖,返回覆盖的value值
         */
        method1();
        /*
            2   从该集合中删除指定键的映射(如果存在
                public V remove(Object key)
                返回值:V
                    key存在,键值对被删除,返回被删除的key对应的值
                    key不存在,返回值为null
         */
        method2();
        /*
            3   如果此映射包含指定键的映射,则返回 true
                boolean containsKey(Object key)
                包含返回true,不包含返回false
         */
        method3();
        /*
            4   public V get(Object key)
                返回到指定键所映射的值
                返回值:V
                    如果key存在,返回对应的value的值
                    如果key不存在,返回null
         */
        method4();
    }

    private static void method4() {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"赵四");
        map.put(2,"刘能");
        map.put(3,"谢广坤");
        map.put(4,"王老七");
        String s1 = map.get(1);
        System.out.println(s1);//赵四
        String s2 = map.get(5);//null
        System.out.println(s2);
        System.out.println(map);
    }

    private static void method3() {
        Map<String,String> map = new HashMap<>();
        map.put("悟空","猴子");
        map.put("八戒","飞猪");
        map.put("白龙马","小白龙");
        boolean b1 = map.containsKey("八戒");
        System.out.println(b1);//true
        boolean b2 = map.containsKey("唐僧");
        System.out.println(b2);//false
        System.out.println(map);
    }

    private static void method2() {
        Map<String,String> map = new HashMap<>();
        map.put("季军","克罗地亚");
        map.put("亚军","法国");
        map.put("冠军","阿根廷");
        String s1 = map.remove("亚军");
        System.out.println(s1);//法国
        String s2 = map.remove("冷军");
        System.out.println(s2);//null
        System.out.println(map);
    }

    private static void method1() {
        Map<String, String> map = new HashMap<>();
        String s1 = map.put("阿根廷", "梅西");
        System.out.println(s1);//null
        String s2 = map.put("阿根廷", "夺冠");
        System.out.println(s2);//梅西
        System.out.println(map);
    }
}

5.4 Map集合遍历键找值方式

步骤图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYp0FDSH-1681714245814)(photo/JavaSE12_集合.assest/1671431571924.png)]

Map集合遍历键找值方式案例

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

public class Demo02_MapKeySet {
    /*
    Map集合的遍历
        方式一:通过键找值的方式
            返回Map中包含的键的Set视图。
            Set<K> keySet();
        实现步骤:
            1、使用Map集合中的keySet()方法,将Map集合中所有的key取出,存储在Set集合中
            2、遍历Set集合,获取Map集合中的每个Key
            3、通过Map集合中的get(key)方法,通过key找到value
     */
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"tom");
        map.put(2,"anny");
        map.put(3,"jack");
        map.put(4,"mary");
        //1、第一步使用keySet()方法。将key存储在Set集合中
        Set<Integer> s1 = map.keySet();
        //2、第二步,遍历Set集合
        //迭代器遍历
        Iterator<Integer> iterator = s1.iterator();
        while (iterator.hasNext()){
            Integer key = iterator.next();
            //3、第三步,获取Map集合中key对应的value
            String value = map.get(key);
            System.out.println(key+"="+value);
        }

        System.out.println("--------------------");

        //加强for遍历
        for (Integer key : s1) {
            //3、第三步,获取Map集合中key对应的value
            String value = map.get(key);
            System.out.println(key+"="+value);
        }
    }
}

5.5 Entry键值对对象

Map中存放的是两种对象,一种称为key键,一种称为value值,它们是一一对应的关系

这样的一对对象又称之为Map的一个Entry项,Entry将键值对的对应关系封装成了对象,即键值对对象

在遍历Map集合的时候,就可以从每一个键值对对象Entry中获取对应的键和对应的值

Entry表示一对键和值,同时提供了获取对应键和对应值的方法

  • public V getKey( ); 获取Entry对象中的键
  • publi V getValue( ); 获取Entry对象中的值

Map集合提供了获取所有Entry对象的方法

  • public Set<Map.Entry<K,V>> entrySet( ); 获取所有Map集合中的键值对对象的集合(Set集合)

5.6 Map集合遍历键值对方式

遍历步骤:

遍历键值对方式:通过集合中每个键值对对象Entry,获取键值对对象Entry中的键和值

实现步骤:

  • 1、获取Map集合中的所有键值对Entry对象,以Set集合的形式返回,使用entrySet()
  • 2、遍历Set集合,得到每一个Entry对象
  • 3、通过键值对Entry对象,获取Entry对象的键和值,方式使用getKey()和getValue()

Map集合遍历键值对方式案例

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

public class Demo03_MapEntrySet {
    /*
        遍历键值对方式:
            通过集合中每个键值对对象Entry,
            获取键值对对象Entry中的键和值
        实现步骤:
            1、获取Map集合中的所有键值对Entry对象,以Set集合的形式返回,使用entrySet()
            2、遍历Set集合,得到每一个Entry对象
            3、通过键值对Entry对象,获取Entry对象的键和值,方式使用getKey()和getValue()
     */
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"卡卡");
        map.put(2,"姆巴佩");
        map.put(3,"梅西");
        map.put(4,"C罗");
        //1、获取Map集合中的所有键值对Entry对象,以Set集合的形式返回,使用entrySet()
        Set<Map.Entry<Integer, String>> set = map.entrySet();
        //2、遍历Set集合,得到每一个Entry对象
        //迭代器遍历set集合
        Iterator<Map.Entry<Integer, String>> it = set.iterator();
        while (it.hasNext()){
            Map.Entry<Integer, String> entry = it.next();
            //3、通过键值对Entry对象,获取Entry对象的键和值,方式使用getKey()和getValue()
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"="+value);
        }

        System.out.println("-------------------------");
        //加强for遍历set集合
        for (Map.Entry<Integer, String> entry:set){
            //3、通过键值对Entry对象,获取Entry对象的键和值,方式使用getKey()和getValue()
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"="+value);
        }
    }
}

5.7 HashMap存储自定义类型键值

HashMap存储自定义类型键值,Map集合保证key是唯一的,

作为key的元素,必须重写hashCode()和equals()方法。

案例:

import java.util.Objects;

public class User {
    private String name;
    private String address;

    public User() {
    }

    public User(String name, String address) {
        this.name = name;
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) && Objects.equals(address, user.address);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, address);
    }

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Demo04_MapDefined {
    public static void main(String[] args) {
        /*
            方式1:String字符串作为key,user对象作为value
                    key相同,值会覆盖
         */
        method1();

        System.out.println("------------------");
        /*
            方式2:user对象作为key。字符串作为value
                  使用对象作为key,必须重写实体类的hashCode和equals方法
                  否则,key相同,值也不会覆盖
         */
        method2();
    }

    private static void method1() {
        Map<String,User> map = new HashMap<>();
        map.put("东北",new User("赵本山","辽宁"));
        map.put("华北",new User("司马南","北京"));
        map.put("华南",new User("刘德华","香港"));
        map.put("东北",new User("小沈阳","哈尔冰"));
        //1、通过keySet获取Map集合所有的key
        Set<String> set = map.keySet();
        //2.加强for遍历Set集合,得到key,再通过key获取Map集合中的value
        for (String key:set) {
            //3、通过key获取value
            User user = map.get(key);
            System.out.println(key+"="+user);
        }
    }


    private static void method2() {
        Map<User,String> map = new HashMap<>();
        map.put(new User("张三","北京"),"喜欢篮球");
        map.put(new User("李四","上海"),"喜欢排球");
        map.put(new User("王五","广州"),"喜欢足球");
        map.put(new User("张三","北京"),"喜欢棒球");
        //1、使用wntrySet()获取Map集合中的键值对对象Entry
        Set<Map.Entry<User, String>> entrySet = map.entrySet();
        //2.使用迭代器遍历获取entry对象
        Iterator<Map.Entry<User, String>> it = entrySet.iterator();
        while (it.hasNext()){
            Map.Entry<User, String> entry = it.next();
            //3、获取entry中的键和值
            User user = entry.getKey();
            String value = entry.getValue();
            System.out.println(user+"="+value);
        }
    }
}

  • 重写之后,key相同,值会被覆盖

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qjJckLk-1681714245814)(photo/JavaSE12_集合.assest/1671436757866.png)]

  • 未重写,key相同,值不会被覆盖

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZ0elsC2-1681714245815)(photo/JavaSE12_集合.assest/1671436869831.png)]

5.8 LinkedHashMap

HashMap保证课成对元素的唯一,但是无法保证数据的有序。其子类LinkedHashMap即可以实现

LinkedHashMap的底层是链表+哈希表的存储结构,链表用于记录元素的顺序

  • HashMap 存取顺序不同
  • LinkedHashMap 存取顺序相同
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class Demo05_LinkedHashMap {
    public static void main(String[] args) {
        //1、创建HashMap对象,添加数据并打印
        HashMap<String,String> map = new HashMap<>();
        map.put("a","英文");
        map.put("c","俄文");
        map.put("b","中文");
        map.put("d","德文");
        System.out.println(map);
        //2、创建LinkedHashMap对象,添加数据并打印
        LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap();
        linkedHashMap.put(1,"AAA");
        linkedHashMap.put(3,"CCC");
        linkedHashMap.put(2,"BBB");
        linkedHashMap.put(4,"DDD");
        System.out.println(linkedHashMap);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MuekNnlJ-1681714245815)(photo/JavaSE12_集合.assest/1671437672943.png)]

5.9 HashMap和HashTable的区别

  • HashTable实现了Map接口
  • HashTable底层是哈希表,是一个线程安全的集合,是单线程集合,速度慢
  • HashMap底层也是哈希表,是一个线程不安全的集合,是多线程集合,速度快
  • HashMap可以存储null值,null键。但是HashTable不可以存储null值,null键
  • HashTable在1,2版本之后被HashMap、Arraylist取代了,但是其子类Properties集合依然在使用
  • Properties集合是一个唯一可以与IO流两结合的集合
import java.util.HashMap;
import java.util.Hashtable;

public class Demo06_HashTable {
    public static void main(String[] args) {
        //!、创建HashMap集合,存储null值,null键,并打印输出
        HashMap<String, String> map = new HashMap<>();
        map.put(null, "AAA");
        map.put("A", null);
        map.put(null, null);
        System.out.println(map);
        //2、创建HashTable集合,存储null值,null键,并打印输出
        Hashtable<Integer, String> table = new Hashtable<>();
        table.put(1, "AAA");
        table.put(null, "BBB");
        table.put(2, null);
        table.put(null, null);
        System.out.println(table);
        /*
            Hashtable的键和值都不能为null,否则会报空指针异常
         */
    }
}

在这里插入图片描述

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

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

相关文章

web自动化测试入门篇06 —— 元素定位进阶技巧

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

camunda的manual task节点用途

Camunda的Manual Task用于在流程中暂停执行&#xff0c;直到人工干预完成某个任务。与User Task不同&#xff0c;Manual Task没有分配给特定用户或用户组&#xff0c;而是需要手动启动并指定下一步流程。 Manual Task可以用于以下场景&#xff1a; 1、流程执行需要等待人工干…

13-nginx

一 初始Nginx 1 Nginx概述 Nginx是一款轻量级的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。Nginx 专为性能优化而开发&#xff0c;使用异步非阻塞事件驱动模型。 常见服务器 …

MySQL基础——约束

前言 MySQL在我们工作中都会用到&#xff0c;那么我们最常接触的就是增删改查&#xff0c;而对于增删改查来说&#xff0c;我们更多的是查询。但是面试中&#xff0c;面试官又不会问你什么查询是怎么写的&#xff0c;都是问一些索引啊&#xff0c;事务啊&#xff0c; 底层结构…

搞懂 API:XML 和 Json的差异到底有多大

XML和JSON是两种常见的数据格式&#xff0c;它们在现代网络应用中起着重要的作用。本文将介绍XML和JSON的基础知识&#xff0c;并比较它们之间的差异。 XML XML&#xff0c;即可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;&#xff0c;是一种用于描述数…

部署个人博客系统

目录 1.安装jdk 2.安装tomcat 3.数据库 4.部署博客系统 1.建库建表 2.微调代码 3.打包 4.拷贝 5.访问博客系统 为了能将我们写的项目部署到云服务器上 首先需要将部署时所依赖的环境搭建好 需要安装jdk,tomcat,mysql 1.安装jdk 直接使用包管理器进行安装,基于yum安装…

深入拆解 Java 虚拟机-打卡|开篇词 | 为什么我们要学习Java虚拟机?

文章目录 计划缘起跟郑老师学习学习JVM的好处 计划 缘起 JVM对我来说是高深莫测的东西&#xff0c;从事软件开发有些年头了&#xff0c;很难深入的去学习它&#xff0c;一来是工作中没有亟需用到这些&#xff0c;都是写一些业务代码&#xff0c;二来是觉得困难没有坚持下去&a…

每天一道大厂SQL题【Day22】华泰证券真题实战(四)

每天一道大厂SQL题【Day22】华泰证券真题实战(四) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

【Java-Java集合】Java集合详解与区别

【Java-Java集合】Java集合详解与区别 1&#xff09;概述2&#xff09;集合框架图2.1.总框架图2.2.Iterable 框架图2.3.Map 框架图 3&#xff09;List3.1.ArrayList 类继承图3.2.LinkedList 类继承图 4&#xff09;Set4.1.HashSet 类继承图4.2.LinkedHashSet 类继承图4.3.TreeS…

C/C++开发中使用pkg-config来引用依赖库

在使用C/C进行开发的过程中&#xff0c;经常需要引用其它的库&#xff0c;可能是系统已经安装好的&#xff0c;也可能是其它的外部库。 如果是系统支持的库&#xff0c;可能在不同的系统下&#xff0c;其路径也不相同&#xff0c;在项目开发的时候跨平台将会是一个问题。比如&…

从零开始云服务器网卡抓包

从零开始云服务器网卡抓包 一. 服务器上新增自己的用户二. 添加组件libpcap四. 安装测试环境六. 编写demo代码七. 正式项目代码编译八. 结果展示 一. 服务器上新增自己的用户 我这边是ubuntu服务器&#xff0c;其默认username为ubuntu&#xff0c;使用创建服务器时候的密码通过…

10.基于共享储能电站的工业用户日前优化经济调度(论文复现)

matlab代码&#xff1a;基于共享储能电站的工业用户日前优化经济调度 相关程序代码资源&#xff1a;风、光、负荷场景生成&#xff1b;风电出力各场景及概率&#xff1b;光伏出力各场景及概率&#xff1b;负荷各场景及概率&#xff1b;场景的削减&#xff1b;样本概率初始化&a…

【云原生进阶之容器】第六章容器网络6.5.1--Calico网络方案综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

Spring Web容器响应异常排查_Poller线程异常退出

问题一_系统响应异常 问题现象 04-11 18点左右客户反馈系统很慢&#xff1b;18点多&#xff0c;反馈pda登录异常&#xff1b; 19:20左右&#xff0c;本地网页登录&#xff0c;某些请求超时&#xff1b;某些正常&#xff1b; 短时间定位后无头绪&#xff0c;保留了stack和dum…

球友的一个帖子,半夜三点给我整睡不着了……

文章目录 一、起因二、建议1、括号和缩进2、仔细审题3、独立思考4、早起的好办法5、chatgpt会代替人类吗&#xff1f; 三、解决1、数据结构2、初始化3、判定 一、起因 事情的起因源自于星球里面一位球友的帖子&#xff0c;本来三点醒来上完厕所打算继续睡&#xff0c;突然手机响…

无人机应急救援有保障吗?如何实现救援?

无人机应急救援有保障吗?如何实现救援?中国自然灾害种类较多&#xff0c;分布地域广&#xff0c;发生频率较高。当遭遇洪水、火灾、洪水、地震、暴雪等灾害事故时&#xff0c;常规的信息通信基础设施受到损伤&#xff0c;导致信号中断。如果灾害事故地点相对偏僻&#xff0c;…

淄博旅游“一夜爆火”,五一流量大盘已经开启

全民调休换来的五一小长假即将来临&#xff0c;经过几年“禁锢”后&#xff0c;这两年的旅游业开始回暖。 而今年国内旅游黑马竟指向了新人淄博。 山东淄博烧烤一直以来都“小有名气”&#xff0c;但是这只在周边城市&#xff0c;或者部分人群里传播&#xff0c;而在今年&…

来使用分支语句和循环语句实现一个小游戏吧(猜数字游戏)

猜数字游戏 1.代码展示2.菜单设计3.主函数部分3.随机数设计 1.代码展示 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h>void menu() {printf("************************\n");printf("*** 1.p…

移动端导航设计

根据产品层级的深度和广度&#xff0c;选择适合的导航模式&#xff0c;是产品设计中的关键一环。 任何APP的组织信息都需要以某种导航框架固定起来&#xff0c;一个新的产品合适的导航框架&#xff0c;决定了产品之后的延伸和扩展。 移动端的屏幕尺寸就这么大&#xff0c;操作方…

java定位系统源码,通过独特的射频处理,配合先进的位置算法,可以有效计算出复杂环境下的人员与物品的活动信息

智慧工厂人员定位系统源码&#xff0c;区域电子围栏管控源码 文末获取联系&#xff01; 在工厂日常生产活动中&#xff0c;企业很难精准地掌握访客和承包商等各类人员的实际位置&#xff0c;且无法实时监控巡检人员的巡检路线&#xff0c;当厂区发生灾情或其他异常状况时&#…