重学java 56. Map集合

我们要拥有一定成功的信念

                                —— 24.6.3

一、双列集合的集合框架

HashMap

        1.特点:

                a.key唯一,value可重复

                b.无序

                c.无索引

                d.线程不安全

                e.可以存null键,null值

        2.数据结构:哈希表

LinkedHashMap(继承HashMap)

        1.特点:

                a.key唯一,value可重复

                b.有序

                c.无索引

                d.线程不安全

                e.可以存null键,nul值

        2.数据结构:哈希表+双向链表

Hashtable

        1.特点:

                a.key唯一,value可重复
                b.无序
                c.无索引
                d.线程 安全
                e.不可以存null键,null值

        2.数据结构:哈希表

Properties(继承Hashtable)

        1.特点

                a.key唯一,value可重复

                b.无序

                c.无索引

                d.线程安全
                e.不能null键null值

                f.key和value都是String型的

        2.数据结构:哈希表

TreeMap

        1.特点:

                a.key唯-,value可重复

                b.可以对key进行排序

                c.无索引
                d.线程不安全
                e.不能存null键null值

        2.数据结构:红黑树

二、Map的介绍

1.概述

        是双列集合的顶级接口

2.元素特点

        元素都是由key(键),value(值)组成 —> 键值对

三、HashMap的介绍和使用

1.概述

        HashMap是Map的实现类

2.特点

        a、key唯一,value可重复 —> 如果key重复了,会发生value值覆盖

        b、无序

        c、无索引

        d、线程不安全

        e、可以存null键null值

3.数据结构

        哈希表

4.方法

        V put(K key,V value) -> 添加元素,返回的是

        V remove(Object key) -> 根据key删除键值对,返回的是被删除的value

        V get(Object key) -> 根据key获取value

        boolean containsKey(Object key) -> 判断集合中是否包含指定的key

        Collection<V> values() -> 获取集合中所有的value,转存到Collection集合中

        Set<K> keyset() —> 将Map中的key获取出来,特存到set集合中

        Set<Map.Entry<K,V>> entryset() —> 获取Map集合中的键值对,转存到Set集合中

    public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        // V put(K key,V value) -> 添加元素,返回的是被覆盖的value
        map.put(1, "lk");
        map.put(2,"lxr");
        map.put(3,"twq");
        map.put(4,"lcl");
        System.out.println(map);

        // V remove(Object key) -> 根据key删除键值对,返回的是被删除的value
        String value = map.remove(3);
        System.out.println(value);
        System.out.println("删除后:"+map);

        // V get(Object key) -> 根据key获取value
        System.out.println(map.get(4));

        // V boolean containsKey(Object key) -> 判断集合中是否包含指定的key
        System.out.println(map.containsKey(3));
        System.out.println(map.containsKey(4));

        // Collection<V> values() -> 获取集合中所有的value,转存到Collection集合
        Collection<String> collection = map.values();
        System.out.println(collection);
    }

四、LinkedHashMap的介绍

1.概述:

        LinkedHashMap extends HashMap

2.特点:

        a.key唯一,value可重复 —> 如果key重复了,会发生value覆盖

        b.有序

        c.无索引

        d.线程不安全
        e.可以存null键null值

3.数据结构:

        哈希表 + 双向链表

4.使用:和HashMap一样

    public static void main(String[] args) {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        map.put(4,"赵六");
        map.put(3,"马七");
        System.out.println(map);    // {1=张三, 2=李四, 3=马七, 4=赵六} 值覆盖
    }

5.HashMap的两种遍历方式

        方式1:获取key,根据key再获取value

                Set<K> keyset() —> 将Map中的key获取出来,特存到set集合中

        方式2:同时获取key和value

                Set<Map.Entry<K,V>> entryset() —> 获取Map集合中的键值对,转存到Set集合中

                a.获取记录key和value的对象(结婚证),Map接口中的静态内部接口:Map.Entry
                b.调用Map.Entry中的两个方法:getKey()  获取key

                        getValue() 获取value

    public static void main(String[] args) {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        map.put(4,"赵六");
        map.put(3,"马七");
        System.out.println(map);

        // Set<K> keyset() —> 将Map中的key获取出来,特存到set集合中
        Set<Integer> set = map.keySet();
        for (Integer i : set) {
            // 根据key获取value
            System.out.println(i+"…"+map.get(i));
        }

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

        // Set<Map.Entry<K,V>> entryset() —> 获取Map集合中的键值对,转存到Set集合中
        Set<Map.Entry<Integer, String>> set1 = map.entrySet();
        for (Map.Entry<Integer, String> entry : set1) {
            // Set集合中只保存“结婚证” -> Map.Entry,我们需要将保存的这个遍历出来
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"…"+value);
        }
    }

6.去重复

package S89HashMap;

import java.util.HashMap;

public class Demo249HashMapUnique {
    public static void main(String[] args) {
        HashMap<Person,String> map = new HashMap<>();
        map.put(new Person(17,"小明"),"河北省");
        map.put(new Person(19,"小帅"),"山东省");
        map.put(new Person(15,"小刚"),"陕西省");
        map.put(new Person(18,"小美"),"四川省");
        map.put(new Person(19,"小帅"),"青海省");
        System.out.println(map);
        // {Person{name='小明', age=17}=河北省, Person{name='小刚', age=15}=陕西省, Person{name='小帅', age=19}=青海省, Person{name='小美', age=18}=四川省}
    }
}

如果key为自定义类型,去重复的话,重写hashcode和equals方法,去重复过程和set一样

因为set集合的元素到了底层都是保存到了map的key位置上

7.Map的练习

练习1 统计字符出现次数

需求:用Map集合统计字符串中每一个字符出现的次数

        1.创建scanner和HashMap
        2.遍历字符串,将每一个字符获取出来

        3.判断,map中是否包含遍历出来的字符 -> containsKey

        4.如果不包含,证明此字符第一次出现,直接将此字符和1存储到map中

        5.如果包含,根据字符获取对应的value,让value++

        6.将此字符和改变后的value重新保存到map集合中

        7.输出

package S89HashMap;

import java.util.HashMap;
import java.util.Scanner;

public class Demo250HashMapText01 {
    // 统计字符个数
    public static void main(String[] args) {
//        1.创建scanner和HashMap
        Scanner sc = new Scanner(System.in);
        HashMap<String, Integer> map = new HashMap<>();
        String data = sc.next();
//        2.遍历字符串,将每一个字符获取出来
        char[] chars = data.toCharArray();
        for (char aChar : chars) {
            String key = aChar+"";
            //        3.判断,map中是否包含遍历出来的字符 -> containsKey
            if (!map.containsKey(key)) {
                //        4.如果不包含,证明此字符第一次出现,直接将此字符和1存储到map中
                map.put(key, 1);
            }else{
                //        5.如果包含,根据字符获取对应的value,让value++
                Integer value = map.get(key);
                value++;
                //        6.将此字符和改变后的value重新保存到map集合中
                map.put(key, value);
            }
        }
//        7.输出
        System.out.println(map);
    }
}

练习2 斗地主Map版

        1.创建数组 ——> color ——> 专门存花色

        2.创建数组 ——> number ——> 专门存牌号

        3.创建map集合,key为序号,value为组合好的牌面

        4.创建一个ArrayList,专门存储key

        5.组合牌,存储在map中

        6.洗牌,打乱list集合中的key

        7.创建四个list集合

        8.发牌

        9.排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class Demo251HashMapText02 {
    public static void main(String[] args) {
        // 1.创建数组 ——> color ——> 专门存花色
        String[] color = "♠-♥-♣-♦".split("-");
        // 2.创建数组 ——> number ——> 专门存牌号
        String[] number = "2-3-4-5-6-7-8-9-10-J-Q-K-A".split("-");
        // 3.创建map集合,key为序号,value为组合好的牌面
        HashMap<Integer, String> poker = new HashMap<>();
        // 4.创建一个ArrayList,专门存储key
        ArrayList<Integer> list = new ArrayList<>();
        list.add(0);
        list.add(1);
        // 5.组合牌,存储在map中
        int key = 2;
        for (String num : number) {
            for (String huaSe : color) {
                String pokerNum = huaSe + num;
                poker.put(key, pokerNum);
                list.add(key);
                key++;
            }
        }

        poker.put(0, "☺");
        poker.put(1, "😊");
//        System.out.println(list);
//        System.out.println(poker);
        // 6.洗牌,打乱list集合中的key
        Collections.shuffle(list);
        // 7.创建四个list集合
        ArrayList<Integer> p1 = new ArrayList<>();
        ArrayList<Integer> p2 = new ArrayList<>();
        ArrayList<Integer> p3 = new ArrayList<>();
        ArrayList<Integer> dipai = new ArrayList<>();

        // 8.发牌
        for (int i = 0; i < list.size(); i++) {
            Integer key1 = list.get(i);
            if (i >= 51) {
                dipai.add(key1);
            } else if (i % 3 == 0) {
                p1.add(key1);
            } else if (i % 3 == 1) {
                p2.add(key1);
            } else if (i % 3 == 2) {
                p3.add(key1);
            }
        }

        // 9.排序
        Collections.sort(p1);
        Collections.sort(p2);
        Collections.sort(p3);
        Collections.sort(dipai);

        lookPoker("张三", p1, poker);
        lookPoker("李四", p2, poker);
        lookPoker("王五", p3, poker);
        lookPoker("底牌", dipai, poker);
    }

    private static void lookPoker(String name, ArrayList<Integer> list, HashMap<Integer, String> map) {
        System.out.print(name+":");

        for (Integer key : list) {
            String value = map.get(key);
            System.out.print(value+" ");
        }
        System.out.println();
    }
}

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

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

相关文章

特征工程技巧—Bert

前段时间在参加比赛&#xff0c;发现有一些比赛上公开的代码&#xff0c;其中的数据预处理步骤值得我们参考。 平常我们见到的都是数据预处理&#xff0c;现在我们来讲一下特征工程跟数据预处理的区别。 数据预处理是指对原始数据进行清洗、转换、缩放等操作&#xff0c;以便为…

Redis中大Key与热Key的解决方案

原文地址&#xff1a;https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库&#xff0c;但是在实际的使用过程中&#xff0c;我们常常会遇到两个常见的问题&#xff0c;也就是文章标题所说的大 key与热 key。 一、定义 1.1…

Vulnhub项目:THE PLANETS: MERCURY

1、靶场地址 The Planets: Mercury ~ VulnHubThe Planets: Mercury, made by SirFlash. Download & walkthrough links are available.https://vulnhub.com/entry/the-planets-mercury,544/ 这好像是个系列的&#xff0c;关于星球系列&#xff0c;之前还做过一个地球的&a…

毕业论文word常见问题

0、前言&#xff1a; 这里的问题都是以office办公软件当中的word为例&#xff0c;和WPS没有关系。 1、页眉横线删不掉&#xff1a; 解决方案&#xff1a;进入页眉编辑状态&#xff0c;在开始选项栏中选择页眉字体样式&#xff0c;清除格式。 修改方式如下&#xff1a; 2、…

从网路冲浪到three.js+cannon.js

从网路冲浪开始 网络浏览器的发展史可以追溯到互联网的早期,随着时间的推移,浏览器已经经历了多次重大的变革和发展。 以下是网络浏览器发展史的一个简要概述: 1. 早期的文本浏览器 1990年:蒂姆伯纳斯-李(Tim Berners-Lee)开发了第一个网络浏览器WorldWideWeb(后来更名…

【十二】图解mybatis日志模块之设计模式

图解mybatis日志模块之设计模式 概述 最近经常在思考研发工程师初、中、高级工程师以及系统架构师各个级别的工程师有什么区别&#xff0c;随着年龄增加我们的技术级别也在提升&#xff0c;但是很多人到了高级别反而更加忧虑&#xff0c;因为it行业35岁年龄是个坎这是行业里的共…

【轻松搞定形象照】助你打造编程等级考试、竞赛专属二寸靓照,报名无忧,展现最佳风采!

更多资源请关注纽扣编程微信公众号 ​ 在数字化时代&#xff0c;拍照似乎变得轻而易举&#xff0c;但当我们需要一张特定规格的一寸照片时&#xff0c;事情就变得复杂起来。随着编程等级考试和各类信息学竞赛的日益临近&#xff0c;不少考生都为了一张符合要求的一寸照片而忙…

2.2 OpenCV随手简记(三)

图像的阈值处理定义 &#xff1a;将图像转化为二值图像&#xff08;黑白图&#xff09;, 也可以用于彩色图形&#xff0c;达到夸张的效果 目的&#xff1a;是用来提取图像中的目标物体&#xff0c;将背景和噪声区分开&#xff08;可以近似的认为除了目标全是噪声&#xff09;。…

Capto 标准版【简体中文+Mac 】

Capto 是一套易于使用的屏幕捕捉、视频录制和视频编辑 Capto-capto安装包-安装包https://souurl.cn/DPhBmP 屏幕录制和教程视频制作 记录整个屏幕或选择的任何特定区域。在创建内容丰富的教程视频时选择显示或隐藏光标。无论您做什么&#xff0c;都可以确保获得高质量的视频。…

C# WinForm —— 24 Threading.Timer 组件介绍与使用

1. 简介 System.Threading.Timer 多线程 轻量级 精度高 提供以指定的时间间隔对线程池线程执行方法的机制 和System.Timers.Timer 类似&#xff0c;每隔一段时间触发事件&#xff0c;执行操作(不是由UI线程执行的)&#xff0c;即使事件中执行了比较耗时的操作&#xff0c;也…

教育新基建背景下的光网校园:安徽中澳科技职业学院以太全光网建设之路

作者/安徽中澳科技职业学院 网络中心 刘正峰 安徽中澳科技职业学院隶属于安徽省科技厅,是一所公办高等职业院校。学院在“德厚三分,技高一筹”的校训指引下,坚持“开放性、精品化、技能型”的发展理念,坚持“贴近市场需求、强化实践教学、突出办学特色、培养实用人才”的办学思…

一款高效办公软件及48个快捷键

君子生非异也&#xff0c;善假于物也。 一天&#xff0c;技术同事亲自操刀要撰写一篇公号文档&#xff0c;于是问我需要什么样的排版格式&#xff1f; 我很快甩了一篇《水经注文档排版规范》给对方。 片刻之后&#xff0c;同事觉得这样写文档的效率太低&#xff0c;于是说要…

视频修复工具助你完成高质量的视频作品!

在短视频发展兴起的时代&#xff0c;各种视频层出不穷的出现在了视野中&#xff0c;人们已经从追求数量转向追求质量。内容相同的视频&#xff0c;你视频画质好、质量高的更受大家欢迎&#xff0c;那么如何制作高质量、高清晰度的视频呢&#xff1f;与您分享三个视频修复工具。…

【小白向】微信小程序解密反编译教程

# 前言 最近笔者有做到微信小程序的渗透测试&#xff0c;其中有一个环节就是对微信小程序的反编译进行源码分析&#xff0c;所谓微信小程序反编译&#xff0c;就是将访问的小程序进行反向编译拿到部分源码&#xff0c;然后对源码进行安全审计&#xff0c;分析出其中可能存在的…

Docker基础篇之Docker容器数据卷

文章目录 1. Docker配置容器卷配置时的一个建议2. Docker容器卷目录3. Docker容器卷案例 1. Docker配置容器卷配置时的一个建议 Docker挂载主机目录访问如果出现cannot open directory.:Permission dnied 解决方法&#xff1a;在挂载目录后加一个–privilegedtrue 如果是Cento…

动手学深度学习4.8 数值稳定性和模型初始化-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;14 数值稳定性 模型初始化和激活函数【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&…

C语言指针用法完善篇

一&#xff0c;指针定义&#xff1a; 1&#xff0c;讲解 指针变量用来记录地址数据&#xff0c;没有记录有效地址的指针变量不可以使用。 定义一个变量A和一个指针B,此时变量A存放在内存1000区间&#xff0c;将变量A赋值给指针变量B&#xff0c;此时指针变量B所接收到的并不是…

冯喜运:6.3黄金原油晚间最新行情及独家操作策略指导

【黄金消息面分析】&#xff1a;在全球经济的波动和不确定性中&#xff0c;黄金作为传统的避险资产&#xff0c;其价格走势和市场分析一直是投资者关注的焦点。本周一&#xff08;北京时间6月3日&#xff09;&#xff0c;现货黄金价格基本持平&#xff0c;交易商正在等待本周公…

Leecode---技巧---颜色分类、下一个排列、寻找重复数

思路&#xff1a; 遍历一遍记录0,1,2的个数&#xff0c;然后再遍历一次&#xff0c;按照0,1,2的个数修改nums即可。 class Solution { public:void sortColors(vector<int>& nums){int n0 0, n1 0, n2 0;for(int x: nums){if(x0) n0;else if(x1) n1;else n2;}for…

机器学习第十一次课

前言 从现在开始进入神经网络的领域了 正文 先是一段历史介绍,这个就跳过吧,我觉得这里最重要的就是反向传播这里 反向传播 反向传播&#xff08;Backpropagation&#xff09;是一种训练人工神经网络的算法&#xff0c;它通过计算损失函数关于网络参数的梯度来调整网络参数…