重学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) -> 添加元素,返回的是被覆盖的valuemap.put(1, "lk");map.put(2,"lxr");map.put(3,"twq");map.put(4,"lcl");System.out.println(map);// V remove(Object key) -> 根据key删除键值对,返回的是被删除的valueString value = map.remove(3);System.out.println(value);System.out.println("删除后:"+map);// V get(Object key) -> 根据key获取valueSystem.out.println(map.get(4));// V boolean containsKey(Object key) -> 判断集合中是否包含指定的keySystem.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获取valueSystem.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和HashMapScanner 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中是否包含遍历出来的字符 -> containsKeyif (!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,专门存储keyArrayList<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集合中的keyCollections.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.mzph.cn/web/21677.shtml

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

相关文章

矩阵连乘问题

#include<iostream> using namespace std; #define N 7 void MatrixChain(int p[N],int n,int m[N][N],int s[N][N]) {for(int i1;i<n;i)m[i][i]0;for(int r2;r<n;r)//有多少个相乘(规模){for(int i1;i<n-r1;i){int jir-1;m[i][j]m[i][i]m[i1][j]p[i]*p[i1]*p[j…

小熊家务帮day10- 门户管理

门户管理 1 门户介绍1.1 介绍1.2 常用技术方案 2 缓存技术方案2.1 需求分析2.1.1 C端用户界面原型2.1.2 缓存需求2.1.3 使用的工具 2.2 项目基础使用2.2.1 项目集成SpringCache2.2.2 测试Cacheable需求Service测试 2.1.3 缓存管理器&#xff08;设置过期时间&#xff09;2.1.4 …

深入理解序列化:概念、应用与技术

在计算机科学中&#xff0c;序列化&#xff08;Serialization&#xff09;是指将数据结构或对象状态转换为可存储或传输的格式的过程。这个过程允许将数据保存到文件、内存缓冲区&#xff0c;或通过网络传输至其他计算机环境&#xff0c;不受原始程序语言的限制。相对地&#x…

URL编码:讲解,抓包

URL 编码&#xff08;也称为百分号编码&#xff09;是一种在 URLs 中编码数据的方法。它将特殊字符转换为由百分号&#xff08;%&#xff09;后跟两个十六进制数字组成的格式。URL 编码通常用于将数据传递到网页或 Web 服务器时&#xff0c;以确保 URL 在传输过程中保持一致和安…

167.二叉树:另一棵树的字树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

2.3 OpenCV随手简记(四)

阈值处理是很多高级算法底层处理的预方法之一。 自己求图像平均阈值&#xff1a; # -*- codingGBK -*- import cv2 as cv import numpy as np #求出图像均值作为阈值来二值化 def custom_image(image): gray cv.cvtColor(image, cv.COLOR_BGR2GRAY) cv.imshow("原来&qu…

【JavaScript】---DOM操作1:获取元素

【JavaScript】—DOM操作1&#xff1a;获取元素 文章目录 【JavaScript】---DOM操作1&#xff1a;获取元素一、什么是DOM&#xff1f;1.1 概念1.2 图例演示 二、查找HTML元素2.1 getElementById()2.2 getElementsByTagName()2.3 getElementsByClassName()2.4 querySelector()2.…

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比

【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释&#xff1a; 用户调用如accept、read等系统调用&#xff0c;向内核发起I/O请求后&#xff0c;应用程序…

【Spring Cloud Alibaba】服务注册与发现+远程调用

目录 注册微服务到Nacos&#xff08;服务提供者&#xff09;创建项目修改依赖信息添加启动注解添加配置信息启动服务&#xff0c;Nacos控制台查看服务列表 注册微服务到Nacos&#xff08;服务消费者&#xff09;创建项目添加依赖信息添加启动注解添加配置信息启动服务&#xff…

基于卷积神经网络(CNN)的深度迁移学习在声发射(AE)监测螺栓连接状况的应用

螺栓结构在工业中用于组装部件&#xff0c;它们在多种机械系统中扮演着关键角色。确保这些连接结构的健康状态对于航空航天、汽车和建筑等各个行业至关重要&#xff0c;因为螺栓连接的故障可能导致重大的安全风险、经济损失、性能下降和监管合规问题。 在早期阶段检测到螺栓松动…

vue3路由详解,从0开始手动配置路由(vite,vue-router)

创建一个不含路由的vue项目 &#xff08;查看路由配置可以直接跳过这一段&#xff09; 输入npm指令&#xff0c;然后写一个项目名称&#xff0c;之后一路回车即可 npm create vuelatest 注意这里我们不选引入vue router&#xff0c;成功后可以 查看目录 然后按提示信息输入指…

新闻出版署发布新规定,腾讯游戏限制未成年人端午期间每天一小时

原标题&#xff1a;腾讯游戏端午节期间针对未成年人的游戏时间限制措施 易采游戏网6月3日消息&#xff1a;近日国家新闻出版署针对未成年人沉迷网络游戏问题发布了《关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知》&#xff0c;旨在加强对未成年人保护的力度&#xf…

GIS之arcgis系列06:线划图缓冲区分析

缓冲区工具将在输入要素周围指定距离内创建缓冲区面。 缓冲区例程将遍历输入要素的每个折点并创建缓冲区偏移。 通过这些偏移创建输出缓冲区要素 原理&#xff1a; 01.打开文件 02.确定单位&#xff0c;在文件属性里。 03.工具箱-->分析工具-->邻域分析-->缓冲区。 …

派派派森02

目录 1.容器 1.列表 2.元组 3.字符串 3.序列 4.集合 5.字典 2.数据容器通用操作 • max最大元素 • min最小元素 • 容器的通用转换功能 • 通用排序功能 3.字符串大小比较 4.函数中多个返回值 5.函数参数多种传递方式 1.位置参数 2.关键字参数 3.缺省参数 …

【C++/STL】list(常见接口、模拟实现、反向迭代器)

&#x1f308;个人主页&#xff1a;秦jh_-CSDN博客&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 前言 list的常见接口 对迭代器的封装 节点 重载-> const迭代器 list与vector的对比 反向迭代…

2020长安杯

链接成功 检材一 1检材 1 的操作系统版本是 ()A. CentOS release 6.5 (Final)B. Ubuntu 16.04.3 LTSC. Debian GNU/ Linux 7.8 (wheezy)D. CentOS Linux release 7.6.1810 (Core)D 2检材 1 中&#xff0c;操作系统的内核版本是 ()(答案格式&#xff1a; “1.2.34” 数字和半角…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

前端将DOM元素导出为图片

前端工作中经常会用到把一些元素导出&#xff0c;比如表格&#xff0c;正好项目有遇到导出为excel和导出为图片&#xff0c;就都封装实现了一下&#xff0c;以供其他需求的开发者使用&#xff1a; 1.导出为文档 这个说白了就是下载的功能&#xff0c;传过去检索参数&#xff…

超分辨重建——SRGAN网络训练自己数据集与推理测试(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

计算机视觉与模式识别实验2-1 角点检测算法(Harris,SUSAN,Moravec)

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;Harris算法SUSAN算法Moravec算法 &#x1f9e1;&#x1f9e1;全部代码&#x1f9e1;&#x1f9e1; &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1; Harris算法 Harris算法实现步骤&…