集合框架——Map

双列集合

特点:

  1. 双列集合一次需要存一对数据,分别为键和值
  2. 键不能重复,值可以重复
  3. 键和值是一一对应的,每个键只能找到自己对应的值
  4. 键+值这个整体 称为:键值对 键值对对象 Entry对象

Map集合的常用方法

public class MapDemo1 {public static void main(String[] args) {Map<String,String> map = new HashMap<>();//调用put添加元素 put:添加|覆盖map.put("王老吉","凉茶");map.put("加多宝","凉茶");map.put("脉动","功能型饮料");map.put("可口可乐","碳酸饮料");map.put("特仑苏","纯牛奶");String ValueRet = map.put("特仑苏","纯牛马"); //输出System.out.println(ValueRet); //纯牛奶//删除String Ret = map.remove("加多宝");System.out.println(Ret); //凉茶System.out.println(map);//{脉动=功能型饮料, 特仑苏=纯牛马, 王老吉=凉茶, 可口可乐=碳酸饮料}//获取集合长度int length = map.size();System.out.println(length); //4//查找指定的键是否存在boolean a = map.containsKey("可口可乐");System.out.println(a); //trueboolean b = map.containsKey("雪碧");System.out.println(b); //false//查找指定的值是否存在boolean c = map.containsValue("纯牛马");System.out.println(c); //trueboolean d = map.containsValue("QQ糖");System.out.println(d); //false//判断集合是否为空boolean e = map.isEmpty();System.out.println(e); //false}
}

Map集合的遍历方式

1.键找值

public class MapDemo2 {public static void main(String[] args) {//创建HashMap集合Map<String,String> map = new HashMap<>();//添加数据map.put("tom","汤姆");map.put("peter","彼得");map.put("jack","杰克");map.put("smith","史密斯");//Map集合的第一种遍历方式 键找值// 调用 map.keySet() 获取所有的键 Set<String> keys = map.keySet();//遍历单列集合 得到每一个键System.out.println("=============迭代器=============");Iterator<String> it = keys.iterator(); //获取单列集合迭代器while (it.hasNext()){String s = it.next();System.out.println("key="+s+"\tvalue="+map.get(s)); //map.get(s):通过传入s(键)返回对应的值}System.out.println("=============增强for===========");for (String key : keys) {String value = map.get(key);System.out.println("键="+key+"\t值="+value);}System.out.println("=============lambda===========");keys.forEach( s->System.out.println(s+"="+map.get(s)));}
}

2.键值对

public class MapDemo3 {public static void main(String[] args) {//Map集合的第二种遍历方式 键值对Map<String,String> map = new HashMap<>();map.put("tom","汤姆");map.put("peter","彼得");map.put("jack","杰克");map.put("smith","史密斯");//通过一个方法 map.entrySet() 获取所有的键值对对象,返回一个set集合Set<Map.Entry<String, String>> entries = map.entrySet();//遍历entries这个集合,去得到里面每个键值对对象for (Map.Entry<String, String> entry : entries) {//利用entry调用get方法获取键和值String key = entry.getKey();String value = entry.getValue();System.out.println("键="+key+"  值="+value);}Iterator<Map.Entry<String, String>> it = entries.iterator();while (it.hasNext()){Map.Entry<String, String> s = it.next();System.out.println(s.getKey()+"="+s.getValue());}System.out.println("===========lambda===========");entries.forEach(s -> System.out.println(s.getKey()+"="+s.getValue()));}
}

3.lambda表达式

public class MapDemo4 {public static void main(String[] args) {Map<String,String> map = new HashMap<>();map.put("tom","汤姆");map.put("peter","彼得");map.put("jack","杰克");map.put("smith","史密斯");//利用lambda表达式进行遍历 map.forEachmap.forEach((String key, String value) -> System.out.println(key+"="+value));}
}

 

HashMap

  1. 是Map里面的一个实现类
  2. 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了
  3. 特点都是由键决定的:无序 不重复 无索引
  4. HashMap跟HashSet底层原理是一模一样的,都是哈希表结构

总结

  1. HashMap底层是哈希表结构的
  2. 依赖hashCode方法和equals方法保证键的唯一
  3. 如果键存储的是自定义对象,需要重写hashCode和equals方法
  4. 如果值存储自定义对象,不需要重写hashCode和equals方法

HashMap测试题
 1.    创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)
    存储三个键值对元素,并遍历要求:同姓名,同年龄认为是同一个学生

public class HashMapDemo1 {public static void main(String[] args) {Map<Student3, String> map = new HashMap<>();Student3 s1 = new Student3("zhangsan", 18);Student3 s2 = new Student3("lisi", 19);Student3 s3 = new Student3("wangwu", 17);Student3 s4 = new Student3("zhangsan", 18);map.put(s1,"娄底");map.put(s2,"上海");map.put(s3,"长沙");map.put(s4,"昆明");Set<Student3> s = map.keySet(); //获取键的单列集合Iterator<Student3> it = s.iterator(); //获取单列集合的迭代器while(it.hasNext()){Student3 st = it.next();System.out.println(st+"="+map.get(st)); // map.get(st):通过键找值}}
}class Student3{private String name;private int age;public Student3(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student3{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student3 student3 = (Student3) o;return age == student3.age && Objects.equals(name, student3.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

2. 某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是 (A、B、C、D),
    每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。

public class HashMapDemo2 {public static void main(String[] args) {//定义一个数组, 存储四个景点String arr[] = {"A","B","C","D"};//利用随机数模拟80个学生的投票 并把投票的结果存储起来ArrayList<String> list = new ArrayList<>();Random r = new Random();for (int i = 0; i < 80; i++) {int index = r.nextInt(arr.length); //随机范围为0-3list.add(arr[index]); //将投票景点存入list集合中}HashMap<String, Integer> hm = new HashMap<>();for (String name : list) {//判断当前的景点在map当中是否存在if (hm.containsKey(name)){//存在//先获取当前景点已经被投票的次数int count = hm.get(name);//表示当前景点又被添加了一次count++;//把新的次数再次添加到集合中hm.put(name,count);}else {//不存在hm.put(name,1);}}System.out.println(hm);//求最大值int max = 0;Set<Map.Entry<String, Integer>> entries = hm.entrySet();for (Map.Entry<String, Integer> entry : entries) {int count = entry.getValue(); //如果if (count > max){max = count;}}System.out.println("最大值是"+max);//判断哪个景点和最大值的次数一样,如果一样则打印出来for (Map.Entry<String, Integer> entry : entries) {if (entry.getValue() == max){System.out.println("被选择最多次数的景点是"+entry.getKey());}}}
}

LinkedHashMap

由键决定:有序 不重复 无索引

有序指的是保证存储和取出的元素顺序一致

底层:底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双向链表的机制记录存储的顺序

public class LinkedHashMap1 {public static void main(String[] args) {/*由键决定:有序 不重复 无索引有序指的是保证存储和取出的元素顺序一致底层:底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双向链表的机制记录存储的顺序*///创建集合Map<String,Integer> lhm = new LinkedHashMap<>();//添加元素lhm.put("tom",11);lhm.put("tom",111);lhm.put("jack",12);lhm.put("peter",13);System.out.println(lhm); //打印集合:有序,不重复//{tom=111, jack=12, peter=13} tom=111:  put方法同样有两个功能 添加/覆盖}
}

 

TreeMap

TreeMap跟TreeSet底层原理一样,都是红黑树结构

由键决定特性: 不重复 无索引 可排序

可排序:对键进行排序

注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则

两种排序规则

实现Comparable接口,指定比较规则

public class TreeMapDemo1 {public static void main(String[] args) {/*需求1:整数表示id键:值:字符串表示商品名称要求:按照id的升序排列、按照id的降序排列*/Map<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {//o1:表示当前要添加的元素//o2:表示已经在红黑树中存在的元素//return o1 - o2; 升序return o2 - o1;}});tm.put(1,"QQ糖");tm.put(3,"AD钙");tm.put(2,"旺仔牛奶");tm.put(2,"忘崽牛奶");System.out.println(tm); //按照键的大小排序//输出:{3=AD钙, 2=忘崽牛奶, 1=QQ糖}}
}

创建集合时传递Comparator比较器对象,指定比较规则

import java.util.*;/*** @author hyk~*/
public class TreeMapDemo2 {public static void main(String[] args) {/*需求2:键:学生对象值:籍贯要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名年龄视为同一个人。*/Student5 s1 = new Student5("jack",10);Student5 s2 = new Student5("tom",15);Student5 s3 = new Student5("peter",14);Student5 s4 = new Student5("jack",10);TreeMap<Student5, String> tm = new TreeMap<>();tm.put(s1,"长沙");tm.put(s2,"怀化");tm.put(s3,"娄底");tm.put(s4,"上海");for (Map.Entry<Student5, String> entry : tm.entrySet()) {Student5 key = entry.getKey();String value = entry.getValue();System.out.println(key + "=" + value);}}
}class Student5 implements Comparable<Student5>{private String name;private int age;public Student5(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student5{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student5 student5 = (Student5) o;return age == student5.age && Objects.equals(name, student5.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic int compareTo(Student5 o) {/*this: 表示当前要添加的元素o: 表示已经在红黑树中存在的元素如果返回是负数:要添加的元素是小的 存左边如果返回是正数:要添加的元素是大的 存右边如果返回是 0 :要添加的元素已经存在,不存入*/int num =  this.getAge() - o.getAge();//如果年龄相差为0 则说明年龄一样 按名字排序num = num == 0 ? this.getName().compareTo(o.getName()) : num;return num;}
}

测试题: 

public class TreeMapDemo3 {/*需求:字符串 aababcabcdabcde 请统计字符串中每一个字符出现的次数,并按照以下格式输出输出结果:a(5) b(4)c(3) d(2) e(1)统计思想:利用map集合进行统计如果没有要求对结果进行排序:默认使用HashMap(效率高)如果要求对结果进行排序,使用TreeMap(可排序)*/public static void main(String[] args) {//定义字符串String str = "aababcabcdabcde";//创建集合Map<Character,Integer> tm = new TreeMap<>();for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);//charAt() 方法是 String 类的一个成员方法,// 用于获取字符串中指定位置的字符。// 它的作用是返回字符串中指定索引位置处的字符。if (tm.containsKey(c)){//存在 表示当前字符又出现了一次int count = tm.get(c); //tm.get(c):返回的是值count++;tm.put(c,count);}else{//不存在 表示当前字符是第一次出现 直接添加tm.put(c,1);}}tm.forEach((Character character, Integer integer)-> System.out.print(character +"("+integer+") "));//a(5) b(4) c(3) d(2) e(1) }
}

 

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

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

相关文章

ssm框架配置文件例子

emmm。。。。 就是说&#xff0c;正常ssm的配置文件长啥样&#xff1f; 就最基础的&#xff1f; 贴一下&#xff0c;备忘吧。 第一个&#xff1a;applicationContext.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http…

软考 - 系统架构设计师 - 敏捷开发方法

前言 敏捷开发方法是一种以人为核心、迭代、循序渐进的软件开发方法。它强调团队合作、客户需求和适应变化&#xff0c;旨在通过快速迭代和反馈来快速交付高质量的软件产品。 敏捷开发方法的优势在于能够快速响应变化、提高开发效率和质量、增强团队协作和沟通&#xff0c;并降…

Python程序设计 多重循环

教学案例六 多重循环 1.n之内的素数 输入n&#xff0c;显示n之内的所有素数 每行显示10个素数 例如&#xff0c;若输入500&#xff0c;结果如图所示 neval(input()) #代码开始 c 0for i in range(2, n1):for j in range(2, i):if i % j 0:breakelse:c 1print("{:5d}…

四年旅程,一路成长——小雨的创作纪念日

四年旅程&#xff0c;一路成长——小雨的创作纪念日 收到来信&#xff0c;回顾与再开始回首起点&#xff0c;初探技术世界持续前行&#xff0c;从坚持到自信今日之感&#xff0c;持续分享与感恩【3.19故事对话】我一定可以&#xff01;“新”认知状态变化感受复盘 朝着未来&…

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案&#xff0c;帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…

C# OpenCvSharp-HoughCircles(霍夫圆检测) 简单计数

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using O…

http模块 服务器端如何响应(获取)静态资源?

一、静态资源与动态资源介绍&#xff1a; &#xff08;1&#xff09;静态资源 内容长时间不改变的资源。eg&#xff1a;图片、视频、css js html文件、字体文件... &#xff08;2&#xff09;动态资源 内容经常更新的资源。eg&#xff1a;百度首页、淘宝搜索列表... 二、服…

vue3从精通到入门7:ref系列

Vue 3 的 Ref 是一个集合&#xff0c;包括多个与响应式引用相关的功能&#xff0c;这些功能共同构成了 Vue 3 响应式系统的重要组成部分。以下是更全面的介绍&#xff1a; 1.ref ref 接受一个内部值并返回一个响应式且可变的 ref 对象。这个对象具有一个 .value 属性&#xf…

每天学习一个Linux命令之uniq

每天学习一个Linux命令之uniq 介绍 在Linux操作系统中&#xff0c;有许多强大的命令可以帮助我们提高工作效率。本篇博客将详细介绍一个非常有用的命令&#xff1a;uniq。uniq命令用于从已排序的文件或标准输入中删除重复的行&#xff0c;并将结果输出到标准输出中。 命令格…

【小熊猫 ide】更新支持mingw 支持c++20

没有format 头文件 GCC版本对C++的支持情况即使我使用11,也没有format 头文件小熊猫 ide https://wwe.lanzoui.com/b01os0mwd最新11可以自己更新https://royqh1979.gitee.io/redpandacpp/docsy/docs/gcc13 才支持format [7GCC 13 has added support for std::format.](https:/…

算法刷题笔记(3.25-3.29)

算法刷题笔记 3.25-3.29 1. 相同的树2. 二叉树的最近公共祖先3. 二叉搜索树中第K小的元素通过双端队列duque 中序遍历 4. 二叉树的锯齿形层序遍历new LinkedList<Integer>(levelList)双端队列复制 数组需要左右顺序&#xff0c;考虑双端队列 5. 岛屿数量6. 字典序排数&am…

Device Change-Procedure

Start Conditions: • The Service Provider has provided to the SM-DP the relevant information and configuration for the Device Change (see Annex O). • The End User has an old Device containing a Profile. • The eUICC and the LPAd of the old Device support …

python---基础(一)

文章目录 前言1.对象的基本组成2.变量和常量2.1.变量的声明2.2.常量_链式赋值_系列解包赋值2.2.1.常量是不是真的常量&#xff1f;2.2.2.链式赋值2.2.3.系列解包赋值 3.内置数据类型_基本算数运算符3.1四种内置数据类型3.2.基本运算符3.3.divmod() 前言 这几年&#xff0c;随着…

【Python】——变量名的命名规则

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【C脚本】计算PCM的DBFS(分贝全尺度)

DBFS是分贝全尺度&#xff08;Decibels Full Scale&#xff09;的缩写&#xff0c;是一种用于衡量音频信号强度的单位。DBFS是相对于数字音频的最大可能幅度而言的&#xff0c;它的取值范围通常是从0到-∞。在DBFS中&#xff0c;0表示音频信号的最大幅度&#xff0c;-∞表示完全…

Dijkstra堆优化之蓝桥王国

Dijkstra堆优化 Dijkstra算法是一种用于解决单源最短路径问题的算法&#xff0c;即从图中的一个顶点出发到所有其他顶点的最短路径。然而&#xff0c;处理大图时&#xff0c;常规的Dijkstra算法可能会遇到性能问题。这就是Dijkstra的堆优化算法派上用场的地方。在堆优化版本中…

Python 用pygame简简单单实现一个打砖块

# -*- coding: utf-8 -*- # # # Copyright (C) 2024 , Inc. All Rights Reserved # # # Time : 2024/3/30 14:34 # Author : 赫凯 # Email : hekaiiii163.com # File : ballgame.py # Software: PyCharm import math import randomimport pygame import sys#…

(23)3.31 进阶指针

int main() { //指针数组 int* arr[4]; char* ch[5]; //数组指针 int arr2[5]; int(*pa)[5] &arr2; char* arr3[6]; char* (*p3)[6] &arr3; return 0; } int test(const char* str) { return 0; } int main() { …

OpenHarmony实战开发-如何使用rating组件实现星级打分功能。

介绍 本篇Codelab将引导开发者使用rating组件实现星级打分功能。 相关概念 rating组件&#xff1a;评分条&#xff0c;可根据用户判断进行打分。 环境搭建 软件要求 DevEco Studio版本&#xff1a;DevEco Studio 3.1 Release及以上版本。OpenHarmony SDK版本&#xff1a;A…

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复&#xff0c;重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…