day20_Map
今日内容
上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、作业
二、比较器排序
三、Collections
四、Map
五、HashMap
六、TreeMap
零、 复习昨日
HashSet 不允许重复元素,无序
HashSet去重原理:
- 先比较hashcode,如果hashcode不一致,直接存储
- 如果hashcode值一样,再比较equals
- 如果equals值为true,则认为完全一样,不存储即去重
- 否则存储
如果使用的是空参构造创建出的TreeSet集合,那么它底层使用的就是自然排序,即放入TreeSet的元素都必须实现Comparable接口,重写方法compareTo
一、作业
public static void main(String[] args) {String[] arr = {"a","b","c","a","b","c"};String[] strArr = setArray(arr);System.out.println(Arrays.toString(strArr ) );}// 第一题// 设计方法,将传入的数组去重后返回// 例如: 字符串数组:[“aa”,”bb”,”cc”,”aa”,”cc”,”bb”],将其去重变为[“aa”,”bb”,”cc”]public static String[] setArray(String[] arr) {// 遍历数组,取出一个,向set集合放一个,最后再变回数组HashSet<String> set = new HashSet<>( );for (String s : arr) {set.add(s);}String[] strArr = new String[set.size()];// 集合转数组String[] result = set.toArray(strArr);return result;}
注意: T[] toArray(T[] arr)
4 创建一个Teacher类 属性age name salary 创建10个Teacher对象 装入TreeSet中通过设置Teacher类 保证age大的在Treeset前面 age相同 salary小的在Treeset前面salary相同 name长度小的在Treeset前面
package com.qf.homework;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class Teacher implements Comparable<Teacher>{private int age;private String name;private double salary;// 省略部分代码...@Overridepublic int compareTo(Teacher o) {// 如果年龄相同,则继续判断if(o.getAge() - this.age == 0){// 再判断工资,如果工资相同,则继续判断if (this.salary - o.getSalary() == 0) {// 判断名字长度,如果名字长度一致,要保留该人名,所以不能返回0,随意返回一个1或者-1// 如果名字长度不一致,名字短的在前return this.name.length() - o.getName().length() == 0 ? 1 : this.name.length() - o.getName().length();} else {// 如果工资不同,工资低的在前return this.salary - o.getSalary() > 0 ? 1 : -1;}} else {// 如果年龄不同,年龄大在前return o.getAge() - this.age;}}
}
public static void main(String[] args) {TreeSet<Teacher> treeSet = new TreeSet<>( );treeSet.add(new Teacher(18,"老邢",50000));treeSet.add(new Teacher(21,"老邢",50000));treeSet.add(new Teacher(19,"小老邢",40000));treeSet.add(new Teacher(19,"老邢",40000));for (Teacher teacher : treeSet) {System.out.println(teacher );}}
二、比较器排序
TreeSet是会对元素进行排序去重,有两种实现方案
- 使用空参构造方法创建出的TreeSet,底层使用自然排序,即元素要实现Comparable接口才能实现排序
- 第二种方案: 可以使用有参构造,在创建TreeSet集合时,传入一个
Comparator
比较器,这样存入的元素就会按照该比较器指定的排序方案排序( 不再使用默认的自然排序)
TreeSet(Comparator comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。
使用步骤
- 自定义类实现Comparator 接口
- 重写compar(T o1,T o2)方法
- o1 就是之前compareTo方法中的this,即正在存储的元素
- o2 就是之前compareTo方法中的o,即以前存储过的元素
- 方法返回值与之前compareTo方法的返回值一样
- 返回0 去重
- 返回负数放左边
- 返回正数放右边
- 在创建TreeSet时,创建该比较器对象,传入TreeSet的构造方法
练习: 把昨天的排序练习使用比较器排序再写一遍
学生语数外总成绩排序题目改写
// 学生成绩类
public class StudentScore{private String name;private int chinese;private int math;private int english;// set get...// 有参 无参构造
}
// 自定义成绩比较器
public class MyScoreComparator implements Comparator<StudentScore> {@Overridepublic int compare(StudentScore o1, StudentScore o2) {return o2.getTotal() - o1.getTotal() == 0 ? 1 : o2.getTotal() - o1.getTotal();}
}
public static void main(String[] args) {// 创建集合时指定成绩比较器TreeSet<StudentScore> set2 = new TreeSet<>(new MyScoreComparator() );set2.add(new StudentScore("zhang3",70,70,70 ));set2.add(new StudentScore("wang5",100,100,100 ));set2.add(new StudentScore("li4",80,80,80 ));set2.add(new StudentScore("zhao6",60,60,60 ));set2.add(new StudentScore("zhou7",90,90,90 ));for (StudentScore score : set2) {System.out.println(score );}}
三、Collections
类似于与Arrays,Collections是集合的工具类,方法都是静态的
- Collections.reverse(List<?> list) 反转
- Collections.shuffle(List<?> list) 混洗
- Collections.sort(List<?> list) 排序
public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>( );list.add(3);list.add(2);list.add(5);list.add(4);list.add(1);System.out.println(list );// 反转// Collections.reverse(list);//System.out.println(list );// 混洗//Collections.shuffle(list);// 排序,升序Collections.sort(list);System.out.println(list );}
四、Map<K,V>
Map代表
双列集合
,一次存储一对键值对(K,V)
Map是接口,代表是键映射到值的对象,一个Map不能包含重复的键
,值允许重复
.每个键最多只能映射到一个值,即可以通过键找到值
,但是不能通过值找键
.
方法都是非常常见的方法,但是Map是接口无法演示
Map有两个常用实现类
- HashMap
- TreeMap
五、HashMap[重点]
HashMap是Map的实现类,现在JDK8及以后底层是由数组+链表+红黑树实现
并允许使用null
值和null
键HashMap存储的元素是
不保证迭代顺序,存储的键不允许重复,值允许重复
除了非同步和允许使用 null 之外,
HashMap
类与Hashtable
大致相同
补充: Hashtable是线程安全的map集合,效率低 ; HashMap是线程不安全的,效率高
ConcurrentHashMap 即安全又高效的Map集合
HashMap的容量和扩容: 初始容量16,加载因子0.75 阈值是 16 * 0.75,达到阈值扩容至原来的2倍
ps: 昨天学习的HashSet所有特性,其实就是HashMap的特性,包括去重原理
5.1 方法演示
构造方法
HashMap()
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity)
构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity, float loadFactor)
构造一个带指定初始容量和加载因子的空 HashMap。
HashMap(Map<? extends K,? extends V> m)
构造一个映射关系与指定 Map 相同的新 HashMap。
方法
每个都很重要!!!
public static void main(String[] args) {// 创建空的HashMap;HashMap<String,Integer> map = new HashMap<>();System.out.println(map );// 添加元素,一次添加一对,键值// put方法的返回值,如果该键之前没有映射值,返回null// 如果该键之前映射的有值,则将值覆盖,返回上次的旧值Integer v1 = map.put("a",1);System.out.println(v1 );Integer v2 = map.put("a", 2);System.out.println(v2 );Integer v3 = map.put("d", 4);System.out.println(v3 );map.put("b",2);System.out.println(map );// 取出元素// 通过键返回值Integer v = map.get("a");System.out.println(v );// 集合大小(元素个数)System.out.println(map.size() );// 集合是否为空System.out.println(map.isEmpty() );// 清空集合//map.clear();// 集合大小(元素个数)//System.out.println(map.size() );// 集合是否为空//System.out.println(map.isEmpty() );// 移除元素,根据键移除整个键值对,返回值Integer a = map.remove("a");System.out.println(a );System.out.println(map );/*** boolean containsKey(Object key)* 判断集合中是否包含指定键,有则返回 true。* boolean containsValue(Object value)* 判断集合中是否包含指定值,有则返回 true。*/System.out.println(map.containsKey("A"));System.out.println(map.containsValue(11));}
5.2 迭代/遍历
Map
接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容
- Set keySet() 键集,返回一个Set集合,其中只有键
- Collection values() 值集,返回一个Collection集合,其中只有值
- Set<Map.Entry<K,V>> entrySet() 键值映射集,返回一个Set集合,其中放着key-value对象
5.2.1 键集
public static void main(String[] args) {HashMap<String,Integer> map = new HashMap<>();map.put("a",1);map.put("b",2);map.put("c",3);map.put("d",4);// 键集遍历Set<String> keySet = map.keySet();// 获得迭代器Iterator<String> iterator = keySet.iterator( );while (iterator.hasNext()) {System.out.println(iterator.next());}System.out.println("-----------" );for(String key : keySet) {System.out.println(key );}}
5.2.2 值集
// 值集Collection<Integer> values = map.values();Iterator<Integer> iterator1 = values.iterator( );while (iterator1.hasNext( )) {System.out.println(iterator1.next());}System.out.println("-----------" );for (Integer value : values) {System.out.println(value );}
5.2.3 键值映射集 [非常重要]
Entry是Map接口中的内部接口,代表是一个键值对,即包含键和值.
且该Entry接口中提供了关于操作单个键,值的方法
- K getKey()
- V getValue()
// 获得键值映射集合Set,其中放着EntrySet<Entry<String,Integer>> entrySet = map.entrySet();Iterator<Entry<String,Integer>> iterator2 = entrySet.iterator();while (iterator2.hasNext( )) {// 从迭代器取出的是EntryMap.Entry<String,Integer> entry = iterator2.next();// 通过entry可以单独获得键,值String key = entry.getKey( );Integer value = entry.getValue( );System.out.println(key +"-->" + value );}// for循环for(Map.Entry<String,Integer> entry : entrySet) {System.out.println(entry.getKey() +"--->" +entry.getValue() );}
5.3 去重原理
HashMap的去重其实就是昨天讲的HashSet的去重,因为HashSet底层就是HashMap
在创建HashSet时,其实在底层创建了HashMap
![]()
在向set中添加元素时,其实是向map的key上添加
![]()
所以HashMap的
键的去重原理
就是
- 向键存储数据时,先调用键的hashcode()方法
- 如果hashcode值不一样则直接存储
- 如果hashcode值一样,再调用元素的equals()方法
- 如果equals方法返回false,则存储
- 如果equals方法返回true,则不存储
5.4 HashMap的应用
场景一: 适合有关联映射的场景
设计方法,传入字符串,输出该字符串中每个字符出现的次数,使用HashMap实现
例如: “abcHelloabcWorld”,输出 a出现2次,b出现2次,l出现3次,H出现1次
/*** 倒推: a --> 3 b --> 2* @param str*/public static void cishu(String str) {String[] strArr = str.split("");System.out.println(Arrays.toString( strArr) );HashMap<String, Integer> map = new HashMap<>( );for (int i = 0; i < strArr.length; i++) {String s = strArr[i];if (!map.containsKey(s)) {map.put(s,1);} else {Integer count = map.get(s);count++;map.put(s,count);}}// System.out.println(map );Set<Map.Entry<String, Integer>> entrySet = map.entrySet( );for (Map.Entry<String,Integer> entry :entrySet) {String s = entry.getKey( );Integer count = entry.getValue( );System.out.println("字符"+s+",出现"+count+"次" );}}
场景二: Map可以当实体类对象
public class Student{private int age;private String name;// ...}
Student s1 = new Student(18,"zs");
s1.getAge();
s1.getName();
使用Map模拟对象
HashMap<String, Object> stu = new HashMap<>( );
stu.put("age",18);
stu.put("name","zs");
stu.put("sex","男");
补充 LinkedHashMap: …自行演示
六、TreeMap
TreeMap底层是红黑树(平衡二叉树的一种)
同样式存储键值对,键不允许重复且还会排序
默认是根据键元素的自然顺序排序或者,根据创建TreeMap时指定的Comparator比较器来排序
6.1 方法演示
方法详见api
public static void main(String[] args) {TreeMap<String, Integer> map = new TreeMap<>( );map.put("b",2);map.put("e",5);map.put("a",1);map.put("a",2);map.put("d",4);map.put("c",3);// 其他正常的map方法...// 三个遍历方法...// 特殊的,有关于头尾操作的方法// 获得排序后的第一个String key = map.firstKey( );// 获得排序后的第一个EntryMap.Entry<String, Integer> entry = map.firstEntry( );System.out.println(entry );}
6.2 TreeMap排序去重原理
昨天学习的TreeSet的底层其实就是TreeMap
创建TreeSet时,创建TreeMap
![]()
向set集合添加元素时,其实是向TreeMap的键添加元素
![]()
即TreeMap的排序去重原理是什么?其实如果自然排序就是compareTo(),如果是比较器排序就是compar()方法
- 方法返回0 去重
- 方法返回负数 放在树左侧
- 方法返回正数 放在树的右侧
七、总结
集合体系中最重要最常见的两个集合是ArrayList,HashMap
其他的,
- 记住常用的API(crud和遍历)
- 记住List和Set区别
- 记住ArrayList和LinkedList区别
- 记住HashMap扩容,去重原理
- 记住TreeMap的排序去重原理
相关文章:

day20_Map
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、比较器排序 三、Collections 四、Map 五、HashMap 六、TreeMap 零、 复习昨日 HashSet 不允许重复元素,无序 HashSet去重原理: 先比较hashco…...

localStorage和sessionStorage
目录 一、localStorage和SessionStorage在哪里,是什么 二、localStorage和sessionStorage区别 三、localStorage常用方法 四、sessionStorage常用方法 一、localStorage和SessionStorage在哪里,是什么 【1】在浏览器开发者工具的Application栏目里&…...

IP地址,子网掩码,网段 概念详解
文章目录1. 子网掩码1.1 子网掩码的概念及作用1.2 子网掩码的组成1.3 子网掩码的表示方法1.4 为什么要使用子网掩码?1.5 子网掩码的分类2. 子网掩码和IP地址的关系2.1 根据掩码确定网段IP地址是以 网络号和 主机号来标示网络上的主机的,我们把网络号相同…...

数影周报:动视暴雪疑似数据泄露,数据出境安全评估申报最新进展
本周看点:动视暴雪疑似员工敏感信息及游戏数据泄露;谷歌云计算部门:两名员工合用一个工位;数据出境安全评估申报最新进展;TikTok Shop东南亚商城在泰国和菲律宾公布;智己汽车获九大金融机构50亿元贷款签约.…...

Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)
在这个圈子技术门类中,工作岗位主要有以下三个方向: 安全研发 安全研究:二进制方向 安全研究:网络渗透方向 下面逐一说明一下. 第一个方向:安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#x…...

ChatGPT?听说Biying把它下架了
ChatGPT被玩疯了,开始放飞自我 ChatGPT版微软必应上线不到10天…就被网友玩坏了 先说这个词,放飞自我,什么东西才会放飞自我? 人放飞自我,人?你确定是人? 所以让我们来把上面的句子改写一下。…...

中电金信:金融数字化转型路在何方?这里有答案
近期,媒体大数网整合了业内10份研究报告,详解金融数字化转型的思路、方法与路径。其中「中国电子金融级数字底座“源启”白皮书」也被收录其中。让我们一同阅读文章,探究金融数字化转型相关问题的答案吧。 当前,金融科技正在回归…...

【Leedcode】数据结构中链表必备的面试题(第五期)
【Leedcode】数据结构中链表必备的面试题(第五期) 文章目录【Leedcode】数据结构中链表必备的面试题(第五期)1.题目2.思路图解(1)第一步:复制每一个结点,插入到原结点和下一个结点之…...

ECDH secp256k1 集成
在Android 原生api是不支持secp256k1算法的,所以要先集成以下库:implementation com.madgag.spongycastle:core:1.58.0.0compile com.madgag.spongycastle:prov:1.54.0.0compile com.madgag.spongycastle:pkix:1.54.0.0compile com.madgag.spongycastle:…...

工单模型的理解与应用
工单(任务单)模型的定义 工单模型是一种分派任务的方法,可以用来跟踪、评估和报告任务的完成情况。它通常用于针对特定目标的重复性任务或项目,以确保任务能够按时完成并符合期望的标准。 工单模型的基本流程为:提…...

Python年利率计算器【N日年化收益率】
现在有闲钱的人,按照聪明等级从低到高排序应该是钱买股票,一年利率约为-20%钱放银行活期,年利率约为0.3%钱放银行定期,一年利率约为1.5%钱放余额宝(支付宝)或零钱通(微信)࿰…...

3年测试拿8K,被校招来的实习生反超薪资,其实你在假装努力
最近朋友给我分享了一个他公司发生的事 大概的内容呢:公司一位工作3年的测试工资还没有新人高,对此怨气不小,她来公司辛辛苦苦三年,三年内迟到次数都不超过5次,每天都是按时上下班,工作也按量完成…...

因子分析计算权重
因子分析两类权重计算方法总结 案例背景 疫情爆发以来,越来越多的人为了避免线下与人接触,选择了线上购买生活必需品。网购虽然方便快捷,但是随着订单压力的增加,物流问题也随之出现,近期有很多卖家收到物流投诉的问题…...

国家调控油价预测案例+源码
项目git地址:https://github.com/Boris-2021/Oil-price-control-forecast 使用已知的历史数据:日期、汇率、布伦特、WTI、阿曼原油价格,预测下一个调价周期中的汽油、柴油零售限价的调价价格。 一. 需求 1.1 需求说明 使用已知的历史数据&a…...

Gephi快速入门
Gephi快速入门1. 导入文件(Import file)2. 布局(Layout)3. 排序(Ranking)4. 指标(Metrics)5. 标签(Label)6. 社区发现(Community detection&#…...

GitHub
什么是 Github?GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。一、常用词Watch:观察。如果watch了一个项目,之后这个项目有更新,你会在第一时间收到该项目更…...

QT基础入门【调试篇】QT远程部署与调试嵌入式ARM开发板
目录 一、环境配置 1、根据开发板完成交叉编译链以及GDB的配置(因开发板而异)...

可观测性最佳实践|阿里云事件总线 EventBridge 最佳实践
本文介绍如何把阿里云事件总线 EventBridge 的内容接入观测云平台,通过观测云强大的统一汇聚能力轻松获取阿里云事件,实时追踪最新的数据信息。 背景信息 事件总线 EventBridge 是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定…...

设计模式-行为型
设计模式-行为型 行为型设计模式主要用于软件运行时复杂的流程控制。包含:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式和解释器模式 模板方法模式 在软件设计时,很多时候系…...

Salesforce大揭秘!SaaS鼻祖不为人知的那些事!
Salesforce的世界无疑是广阔的。自从创始人Marc Benioff于1999年创立公司以来,Salesforce一直在打破CRM领域的界限,改变销售、营销和技术的格局。 作为全球领先的B2B科技公司之一,Salesforce和硅谷里的其他企业一样,缔造着一个关…...

Oracle——物化视图
文章目录含义物化视图的语法物化视图的创建1、自动刷新的物化事务 ON COMMIT2、非自动刷新的物化视图 ON demand关于手动刷新物化视图的删除资料参考含义 什么是物化视图? 物化视图,通俗点说就是物理化的视图。 什么叫物理化? 将视图以表结构…...

ur3+robotiq 2f 140配置moveit
ur3robotiq 2f 140配置moveit 参考链接1 参考链接2 官方配置movit教程 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense: D435i 通过下面几篇博客配置好了ur3、力传感器、robotiq夹爪…...

LDO 芯片烫手,问题出在哪里?
设计失误的一个电路,该电路是数字电路的电源,为图方便对12V直接通过线性电源芯片降压到5V: 图1:线性电源降压12V转5V 几块电路板打样好后,测试均发现AMS1117-5.0芯片烫手,负载电流100mA多,也满…...

零日漏洞发展格局及防御策略
在过去的一年半中, 在野利用的零日漏洞数量持续飙升 ,这些软件制造商尚不知晓的漏洞正在被国家行为体黑客组织和勒索软件团伙滥用。 今年上半年,Google Project Zero统计了近20个零日漏洞,其中 大部分针对微软、苹果和谷歌构建的…...

RabbitMQ 可用磁盘空间报警
概要当磁盘可用空间低于设定的值(默认50M),将触发警报,并阻塞所有生产者。这目标是为了避免填满整个磁盘,这将导致所有节点上的写入操作失败,并可能导致RabbitMQ停止服务。如何工作为了减少磁盘被填满的风险…...

Web前端学习:二
二一:文字font-size样式 font-size:**px 控制文字大小,可精准控制大小 默认样式medium,中等的 large,大一号 x-large,再大一号 xx-large,再大一号 small,小一号 <!DOCTYPE html…...

【第一章 计算机网络体系结构,标准化工作相关组织,性能指标,分层结构,OSI参考模型】
第一章 计算机网络体系结构,标准化工作相关组织,性能指标,分层结构,OSI参考模型 1.计算机网络: (1)概念: ①计算机网络是将一个分散的、具有独立功能的计算机系统,通过通…...

SpringIOC源码解析
Spring深度学习(一)——IOC的设计理念Spring的核心思想——IOCSpring流程图DEMO编写Spring IoC容器的加载过程实例化化容器:AnnotationConfigApplicationContext实例化建BeanDefinition读取器: AnnotatedBeanDefinitionReaderBean…...

【Jupyter Notebook的简单入门使用】
【Jupyter Notebook的简单入门使用】简单介绍安装与配置简单使用Markdown关闭简单介绍 Jupyter官网 Jupyter Notebook 介绍 简单来讲,它是一个网页应用,可以进行文档编写,甚至运行 py 代码等功能 安装与配置 下载合适版本的 python &#…...

@Component@Import@Bean加载顺序解析
【前言】 我们在使用Spring注入Bean对象时,会使用不同注解,比如Component Service Controller Import Bean等。由于Service Controller 等都可以归为Component,那么Component 和Import 、Bean是何时被加载的,以及他们之间的顺序呢…...