【Java基础 下】 024 -- 集合进阶(双列集合、HashMap、LinkedHashMap、TreeMap、Collections)

news2024/12/23 11:01:54

学习内容:

目录

一、双列集合

1、双列集合的特点

2、双列集合的常见API

示例代码

3、Map的遍历方式

①、第一种遍历方式:键找值(keySet)

②、第二种遍历方式:键值对(entrySet)

③、第三种遍历方式:Lambda表达式(forEach)

二、HashMap集合

1、HashMap的特点

2、HashMap的底层原理

3、小结

4、HashMap小练习

①、存储学生对象并遍历

②、Map集合案例-统计投票人数

三、LinkedHashMap

四、TreeMap

1、练习:TreeMap基本应用

2、练习:统计个数

3、小结

五、源码解析

1、HashMap的底层原理(一)

①、源码中的类型介绍

②、HashMap中每一个元素是什么?

2、HashMap的底层原理(二)

①、看源码前的准备工作

②、创建对象、第一种情况:添加元素(添加第一个元素,即数组位置为null)底层原理

③、第二种情况:添加其它元素(数组位置不为null)底层原理

​编辑 ④、为什么hashcode值要与数组长度-1做一次“与”运算?【★】

⑤、第三种情况:添加元素(数组位置不为null,键重复,元素覆盖)

3、TreeMap中的底层源码(一)

①、为什么这里的默认颜色为BLACK?

②、TreeMap中每一个节点的内部属性

③、TreeMap类中的成员变量以及构造器

④、put:添加元素

⑤、红黑树规则

⑥、面试小问题

六、可变参数

1、可变参数的练习

①、示例代码:(普通示例)

②、数组使用示例

③、JDK5-可变参数

④、可变参数的小细节

七、Collections

1、addAll() 批量添加元素

2、shuffle() 打乱List集合元素的顺序

3、其它方法

八、综合练习

1、自动点名器

①、自动点名器1(shuffle)

②、自动点名器2(概率 — 随机面)

③、自动点名器3(不重复且会循环点名 — 辅助列表)

④、自动点名器4(权重)

⑤、自动点名器5 —— (GUI界面程序 — 集合、IO、多线程、带权重的随机)

2、Map集合案例——省和市


一、双列集合

1、双列集合的特点

在Map中定义了双列集合所有的共性方法:

2、双列集合的常见API

示例代码

添加元素:put()

删除元素:删除元素,返回删除值 remove()

清空元素:clear()

判断是否包含:containsKey()

判空判断:isEmpty()

长度:size()

3、Map的遍历方式

①、第一种遍历方式:键找值(keySet)

课堂练习:

②、第二种遍历方式:键值对(entrySet)

Entry:键值对对象

课堂练习:

③、第三种遍历方式:Lambda表达式(forEach)

示例代码:

二、HashMap集合

1、HashMap的特点

JDK8之后哈希表的结构是由数组、链表以及红黑树组成的.

2、HashMap的底层原理

  • HashMap首先还是会创建一个默认长度为16,默认加载因子为0.75的数组;
  • 然后再利用put方式,就可以添加数据了,put方法的底层会先创建一个Entry对象,Entry对象里面记录的就是要添加的键和值,然后利用键来计算哈希值,跟值无关,然后再计算出元素在数组中应存储的位置的索引,如果该位置为null,直接添加,如果该位置不为null,它会调用equals方法比较键的属性值,如果键的值相同,那么元素就会被覆盖;如果比较完后不一样,则会添加新的Entry对象;

  • JDK8,如果计算出来的索引相同,且键不一致,那么就会直接挂在当前值的下面;
  • 此外,当链表长度超过8,且数组长度大于等于64的时候,链表就会自动转成红黑树

3、小结

4、HashMap小练习

①、存储学生对象并遍历

示例代码:

在需要在JavaBean——Student.java中重写hashCode与equals方法

测试类:

②、Map集合案例-统计投票人数

示例代码:

求最大值:

3、4步没有办法合一块写,所以务必切记,我们一定要先求出max最大值,才能判断打印景点名

三、LinkedHashMap

示例代码:

四、TreeMap

1、练习:TreeMap基本应用

示例代码:(Integer、Double 默认情况下都是按照升序排列的)

  (String 按照字母在ASCII码表中对应的数字升序排列  abcdefg…)

按照id降序排序:

需求2:

JavaBean implements Comparable: 重写compareTo方法

2、练习:统计个数

示例代码:

遍历集合,并按照指定的格式进行拼接:

  • StringBuilder
  • StringJoiner

3、小结

五、源码解析

1、HashMap的底层原理(一)

①、源码中的类型介绍

⬆:表示该方式是父类或者接口中的方法,后面就标记了父类或接口的名称,我们可以理解为这个方法是重写的父类里面的方法;

➡:继承于Xxxx哪个类

f:表示这是HashMap的属性

I:接口

C:类

②、HashMap中每一个元素是什么?

在HashMap中每一个元素其实都是一个Node对象:

next:表示记录下一个节点的地址值

红黑树:红黑树中的节点为TreeNode

哈希表数组名为Table,默认长度为16

扩容因子:

最大容量:

2、HashMap的底层原理(二)

①、看源码前的准备工作

数组(table)中的键值对对象是分情况讨论的:

  • 数组下面挂的是链表
  • 数组下面挂的是红黑树

②、创建对象、第一种情况:添加元素(添加第一个元素,即数组位置为null)底层原理

刚开始用空参构造创建对象时,底层什么都没有,table也不存在,就是个null

当使用put方法,添加元素后,这个时候数组才存在

put方法:

putVal方法:

扩容机制:

③、第二种情况:添加其它元素(数组位置不为null)底层原理

 ④、为什么hashcode值要与数组长度-1做一次“与”运算?【★】

答:为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间。一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ (n - 1) & hash”。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。

取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)”, 并且 采用二进制位操作 &,相对于%能够提高运算效率。

总结: a % b 操作等于 a & ( b - 1 ) (前提是b等于2n次幂)

⑤、第三种情况:添加元素(数组位置不为null,键重复,元素覆盖)

其它步骤可见③

3、TreeMap中的底层源码(一)

TreeMap的底层为红黑树

①、为什么这里的默认颜色为BLACK?

提高代码的阅读性,红黑树内部还存在调整过程,统一调整成红色。

②、TreeMap中每一个节点的内部属性

③、TreeMap类中的成员变量以及构造器

④、put:添加元素

⑤、红黑树规则

⑥、面试小问题

6.1 TreeMap添加元素的时候,键是否需要重写hashCode和equals方法?

此时是不需要重写的。hashCode和equals方法与HashMap的键有关

6.2 HashMap是哈希表结构的,JDK8开始由数组,链表,红黑树组成的。

既然有红黑树,HashMap的键是否需要实现Compareable接口或者传递比较器对象呢?

不需要的。

因为在HashMap的底层,默认是利用哈希值的大小关系来创建红黑树的

6.3 TreeMap和HashMap谁的效率更高?

如果是最坏情况,添加了8个元素,这8个元素形成了链表,此时TreeMap的效率要更高

但是这种情况出现的几率非常的少。

一般而言,还是HashMap的效率要更高

6.4 你觉得在Map集合中,java会提供一个如果键重复了,不会覆盖的put方法呢?

此时putIfAbsent本身不重要。

传递一个思想:

代码中的逻辑都有两面性,如果我们只知道了其中的A面,而且代码中还发现了有变量可以控制两面性的发生。

那么该逻辑一定会有B面。

习惯:

boolean类型的变量控制,一般只有AB两面,因为boolean只有两个值

int类型的变量控制,一般至少有三面,因为int可以取多个值。

6.5 三种双列集合,以后如何选择?

HashMap LinkedHashMap TreeMap

默认:HashMap(效率最高)

如果要保证存取有序:LinkedHashMap

如果要进行排序:TreeMap

六、可变参数

1、可变参数的练习

①、示例代码:(普通示例)

②、数组使用示例

③、JDK5-可变参数

④、可变参数的小细节

七、Collections

1、addAll() 批量添加元素

2、shuffle() 打乱List集合元素的顺序

3、其它方法

八、综合练习

1、自动点名器

①、自动点名器1(shuffle)

示例代码:

②、自动点名器2(概率 — 随机面)

示例代码:

③、自动点名器3(不重复且会循环点名 — 辅助列表)

示例代码:(点过的就删掉)

④、自动点名器4(权重)

前情提要:带权重的微服务技术

示例代码:(未完待续)

⑤、自动点名器5 —— (GUI界面程序 — 集合、IO、多线程、带权重的随机)

示例代码:(未完待续)

2、Map集合案例——省和市

示例代码:

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

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

相关文章

LeetCode 周赛 333,你管这叫 Medium 难度?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周是 LeetCode 第 333 场周赛,你参加了吗?这场周赛质量很高,但难度标得不对,我真的会谢。算法…

深度学习在视频多目标跟踪中的应用综述

文章目录摘要1、简介2、MOT:算法、指标和数据集2.1、MOT算法简介2.2、指标经典的指标完整的MOT指标ID 分数2.3、基准数据集3、MOT中的深度学习3.1、深度学习中的检测步骤3.1.1、Faster R-CNN3.1.2、SSD3.1.3、Other detectors3.1.4、cnn在检测步骤中的其他用途3.2、深度学习在特…

Git的常用命令

1:软件安装1.1:Git下载与安装百度上搜索Git官网:https://git-scm.com/下载:https://git-scm.com/download/win下载Git安装程序,双击安装 Git-2.9.3.2-64-bit.exe配置环境变量path 使用git --version查看 git 是否安装成…

儿童袖套上架美国亚马逊CPC认证

袖套,也称套袖。是戴在袖管外的套子,旨在保护衣服的袖管。通常戴时松垂于另外一只衣袖外面的袖子。美国CPC认证简介:CPC认证是Children’s Product Certificate的英文简称,CPC证书就类似于国内的质检报告,在通过相关检…

(十七)docker安装RocketMQ

一、简介 操作系统:Linux CentOS 7.3 64位 docker版本:19.03.8 RocketMQ版本:4.3.2 二、实践 1、拉取镜像 docker pull rocketmqinc/rocketmq:4.3.2 2、运行容器 我们先搭建namesrv(Name Server)服务。 它充当路由消息的提供者&#…

vue2提取vue-router的title单独存放,使用i18n实现

成品效果 首先引入i18n(vue-i18n官网文档) 依赖包 npm install vue-i18n8然后单独在src目录下新建一个文件夹lang,存放相对应的变量名称,我这里只做显示中文所以其他引入我都注释了,具体目录如下: src\lang/zh.js部分代码 export…

记一次:request请求总结

前言:和前端联调的时候发现前端人员请求的方式不对,固做此总结问题:request请求方式有多少种?答:Java后端查看有8种,spring-web中的java枚举图如下而使用PostMan查看有15种,如下图GET&#xff0…

前端页面jquery规范写法

使用最新版本的 jQuery 最新版本的 jQuery 会改进性能和增加新功能,若不是为了兼容旧浏览器,建议使用最新版本的 jQuery。以下是三条常见的 jQuery 语句,版本越新,性能越好: $(.elem) $(.elem, context) context.find(.elem) 结果 1.6.2 版执行次数远超两个老版本。 jQ…

eclipse中整理左侧项目栏文件

💡在使用eclipse的过程中,随着项目越来越多,会使得项目管理变得困难,介绍一下eclipse中对于项目分类存放(Java Working Set)的解决方案。如果按照默认的方式查看项目列表是这种效果:⭕当创建使用小项目过多…

Prometheus+Grafana监控

1、简介1.1 Prometheus官网地址:https://prometheus.io/Prometheus是一个开源的监控系统,起源于SoundCloud。它由以下几个核心组件构成:数据爬虫: 根据配置的时间定期的通过HTTP抓去metrics数据。time-series 数据库: …

Ubantu 安装到VMware详解

想要在VMware中运行Linux系统,那么就需要Linux系统安装到VMware虚拟机上面。在这里,以把ubantu16.04安装到VMware虚拟机中为教程进行图文讲解,共分为三个步骤,分别是创建新的虚拟机、安装到ubantu系统、安装VMware Tools。 1.1 创…

响应式网络建站公司网站源码+完整教程

分享一个开源的自适应的三网合一的网络建站公司网站的完整源码,当做互联网公司官网特别合适,带完整搭建教程。此款网站源码适用于小程序制作公司、网络公司、网站建设公司等等,这些都可以用这个网站模板,网站整体非常高端大气&…

vue+vite项目部署会遇到的几个问题

今天来打包硅谷外卖项目,通过解决项目中遇到的问题来加深对vite打包的理解。 运行yarn build 报错,报[WARNING] Expected identifier but found “*” [css-syntax-error] 既然zoom:1是没有变化,直接把它去掉即可。 然后继续yarn build 不出所料还是报…

有序表的应用:设计一个增、删、查数据的时间复杂度均为O(logN)的结构

1、题目描述 设计一个结构包含如下三个方法: void add(int index, int num); //把num加入到index位置 int get(int index); //取出index位置的值(是自然序的index位置,非排序后) void remove(int index); //把index位置上的值删…

【Linux】vim拒绝服务安全漏洞修复

根据国家信息安全漏洞共享平台于2023年2月19日发布的安全漏洞通知,Linux系统自带的vim编辑器存在两个高危安全漏洞(CNVD-2023-09166、CNVD-2023-09647),攻击者可以利用该漏洞发起拒绝服务攻击,并可能运行(恶…

【编程入门】应用市场(Vue版)

背景 前面已输出多个系列: 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目,使…

双因素方差分析

一、案例与数据 一家大型商业银行在多地区设有分行,其业务主要是进行基础设施建设,国家重点项目建设,固定资产投资等项目的贷款。近年来,该银行的贷款额平稳增长,但不良贷款额也有较大比例的提高,这给银行…

数据库

一、数据库系统管理 ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity&#xff0…

【微信小程序】一文带你吃透开发中的常用组件

写在前面 小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构。 官方把小程序的组件分为了9大类,分别是: 1.视图容器 2.基础内容 3.表单组件 4.导航组件 5.媒体组件 6.地图组件 7.画布组件 …

QMap 判断是否value是否已经存在,结合Sleep函数测试

网上查了资料,基本说的都是通过.value判断是否已经之前的key值,但是尝试.了一下发现有.key的函数,对比着来就感觉这个函数是用来判断是否已经存在value值,于是开始百度也几乎没有找到相关资料,只好自己看官方文档&…