【day20】集合深入探讨
模块19回顾
在深入探讨模块20之前,让我们回顾一下day19中的关键内容:
- Collection集合:单列集合的顶级接口,提供了
add、addAll、clear、size、isEmpty、remove、toArray、contains等方法。 - 迭代器(Iterator):通过
iterator方法获取,提供了hasNext()和next()方法。在迭代集合时,不能随意修改集合长度,否则会抛出并发修改异常。 - 数据结构:栈(先进后出)、队列(先进先出)、数组(查询快,增删慢)、链表(查询慢,增删快)。
- ArrayList:特点包括元素有序、有索引、元素可重复、线程不安全。底层数据结构为数组,提供了
add、add(index, element)、remove、size、get、set等方法。自动扩容机制,扩容1.5倍。 - LinkedList:特点包括元素有序、有索引(通过方法支持,非本质索引)、元素可重复、线程不安全。底层数据结构为双向链表,提供了大量直接操作首尾元素的方法。
- 增强for循环:格式为
for(元素类型 变量名:集合名或者数组名),遍历集合时使用迭代器,遍历数组时使用普通for循环。
模块20重点
本模块将深入探讨集合的高级应用,包括:
- 掌握
Collections集合工具类的常用方法。 - 掌握泛型的使用。
- 了解
HashSet和LinkedHashSet的特点及使用。 - 了解
HashSet将元素去重的过程。
第一章:Collections集合工具类
Collections是一个集合工具类,提供了多种静态方法来操作集合。
static <T> boolean addAll(Collection<? super T> c, T... elements):批量添加元素。static void shuffle(List<?> list):将集合中的元素顺序打乱。static <T> void sort(List<T> list):将集合中的元素按照默认规则排序。static <T> void sort(List<T> list, Comparator<? super T> c):将集合中的元素按照指定规则排序。
public class Demo01Collections {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张三", "李四", "王五", "赵六", "田七", "朱八");System.out.println(list);Collections.shuffle(list);System.out.println(list);ArrayList<String> list1 = new ArrayList<>();list1.add("c.举头望明月");list1.add("a.床前明月光");list1.add("d.低头思故乡");list1.add("b.疑是地上霜");Collections.sort(list1);System.out.println(list1);}
}
第二章:泛型
泛型是Java中用于统一数据类型、防止数据类型转换异常的一种机制。
public class Demo01Genericity {public static void main(String[] args) {ArrayList list = new ArrayList();list.add("1");list.add(1);list.add("abc");list.add(2.5);list.add(true);for (Object o : list) {String s = (String) o;System.out.println(s.length());}}
}
2.1 含有泛型的类
public class MyArrayList<E> {Object[] obj = new Object[10];int size;public boolean add(E e) {obj[size] = e;size++;return true;}public E get(int index) {return (E) obj[index];}@Overridepublic String toString() {return Arrays.toString(obj);}
}
2.2 含有泛型的方法
public class ListUtils {public static <E> void addAll(ArrayList<E> list, E... e) {for (E element : e) {list.add(element);}}
}
2.3 含有泛型的接口
public interface MyList<E> {boolean add(E e);
}
2.4 泛型的高级使用
3.1 泛型通配符 ?
public class Demo01Genericity {public static void main(String[] args) {ArrayList<String> list1 = new ArrayList<>();list1.add("张三");list1.add("李四");ArrayList<Integer> list2 = new ArrayList<>();list2.add(1);list2.add(2);method(list1);method(list2);}public static void method(ArrayList<?> list) {for (Object o : list) {System.out.println(o);}}
}
3.2 泛型的上限下限
public class Demo02Genericity {public static void main(String[] args) {ArrayList<Integer> list1 = new ArrayList<>();ArrayList<String> list2 = new ArrayList<>();ArrayList<Number> list3 = new ArrayList<>();ArrayList<Object> list4 = new ArrayList<>();get1(list1);//get1(list2);错误get1(list3);//get1(list4);错误System.out.println("=================");//get2(list1);错误//get2(list2);错误get2(list3);get2(list4);}public static void get1(Collection<? extends Number> collection) {}public static void get2(Collection<? super Number> collection) {}
}
第三章:斗地主案例(扩展案例)
3.1 案例介绍
按照斗地主的规则,完成洗牌发牌的动作。具体规则:使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
3.2 案例分析
- 准备牌:牌可以设计为一个
ArrayList<String>,每张牌由花色数字两部分组成,使用Collections类的shuffle方法进行随机排序。 - 发牌:将每个人以及底牌设计为
ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。 - 看牌:直接打印每个集合。

3.3 代码实现
public class Poker {public static void main(String[] args) {ArrayList<String> color = new ArrayList<>();ArrayList<String> number = new ArrayList<>();ArrayList<String> poker = new ArrayList<>();color.add("♠");color.add("♥");color.add("♣");color.add("♦");for (int i = 2; i <= 10; i++) {number.add(i + "");}number.add("J");number.add("Q");number.add("K");number.add("A");for (String num : number) {for (String huaSe : color) {String pokerNumber = huaSe + num;poker.add(pokerNumber);}}poker.add("😊");poker.add("☺");Collections.shuffle(poker);ArrayList<String> p1 = new ArrayList<>();ArrayList<String> p2 = new ArrayList<>();ArrayList<String> p3 = new ArrayList<>();ArrayList<String> dipai = new ArrayList<>();for (int i = 0; i < poker.size(); i++) {String s = poker.get(i);if (i >= 51) {dipai.add(s);} else if (i % 3 == 0) {p1.add(s);} else if (i % 3 == 1) {p2.add(s);} else if (i % 3 == 2) {p3.add(s);}}System.out.println("涛哥:" + p1);System.out.println("三上:" + p2);System.out.println("金莲:" + p3);System.out.println("底牌:" + dipai);}
}
第四章:红黑树(了解)
集合加入红黑树的目的:提高查询效率。HashSet集合的数据结构包括哈希表,其中JDK8之前为数组+链表,JDK8之后为数组+链表+红黑树,以提高查询效率。

-
每一个节点或是红色的,或者是黑色的
-
根节点必须是黑色
-
如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
-
如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)
-
对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

https://www.cs.usfca.edu/~galles/visualization/RedBlack
第五章:Set集合
Set接口并没有对Collection接口进行功能上的扩充,而且所有的Set集合底层都是依靠Map实现

1.Set集合介绍
Set和Map密切相关,Map的遍历需要先变成单列集合,只能变成Set集合。
2.HashSet集合的介绍和使用
HashSet是Set接口的实现类,具有元素唯一、无序、无索引、线程不安全等特点。底层数据结构为哈希表。
public class Demo01HashSet {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("张三");set.add("李四");set.add("王五");set.add("赵六");set.add("田七");set.add("张三");System.out.println(set);Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}for (String s : set) {System.out.println(s);}}
}
3.LinkedHashSet的介绍以及使用
LinkedHashSet继承自HashSet,具有元素唯一、有序、无索引、线程不安全等特点。底层数据结构为哈希表+双向链表。
public class Demo02LinkedHashSet {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("张三");set.add("李四");set.add("王五");set.add("赵六");set.add("田七");set.add("张三");System.out.println(set);Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}for (String s : set) {System.out.println(s);}}
}
4.哈希值
哈希值是由计算机算出来的一个十进制数,可以看做是对象的地址值。获取对象的哈希值使用的是Object中的方法public native int hashCode()。
注意:
a. 哈希值不一样,内容肯定不一样
b. 哈希值一样,内容也有可能不一样
public class Person {private String name;private Integer age;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name) && Objects.equals(age, person.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Demo01Hash {public static void main(String[] args) {Person p1 = new Person("涛哥", 18);Person p2 = new Person("涛哥", 18);System.out.println(p1);System.out.println(p2);System.out.println(p1.hashCode());System.out.println(p2.hashCode());}
}
5.字符串的哈希值是如何算出来的
字符串的哈希值是通过特定的算法计算出来的,例如String类的哈希算法。
public int hashCode() {int h = hash;if (h == 0 && !hashIsZero) {h = isLatin1() ? StringLatin1.hashCode(value): StringUTF16.hashCode(value);if (h == 0) {hashIsZero = true;} else {hash = h;}}return h;
}
6.HashSet的存储去重复的过程
HashSet通过计算元素的哈希值和比较内容来去重。
public class Test02 {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("abc");set.add("通话");set.add("重地");set.add("abc");System.out.println(set);}
}
7.HashSet存储自定义类型如何去重复
自定义类型需要重写hashCode和equals方法来实现去重。
public class Person {private String name;private Integer age;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name) && Objects.equals(age, person.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class Test03 {public static void main(String[] args) {HashSet<Person> set = new HashSet<>();set.add(new Person("涛哥", 16));set.add(new Person("金莲", 24));set.add(new Person("涛哥", 16));System.out.println(set);}
}
小结
通过本文的学习,希望能够帮助您深入理解集合的高级应用,包括Collections集合工具类的常用方法、泛型的使用、HashSet和LinkedHashSet的特点及使用,以及HashSet将元素去重的过程。这些都是Java集合框架中非常重要的知识点。
相关文章:
【day20】集合深入探讨
模块19回顾 在深入探讨模块20之前,让我们回顾一下day19中的关键内容: Collection集合:单列集合的顶级接口,提供了add、addAll、clear、size、isEmpty、remove、toArray、contains等方法。迭代器(Iterator)…...
【英语语法】用must表对过去推测时,要用完成时must have been / must have done(不能直接用过去时)
文章目录 疑问解释1. 表达过去的推测2. 与时态一致3. 语法结构的限制4. 例子对比总结 疑问 This must have been a year-round activity as no structures have been found which would have been used to shelter animals in the winter. 为什么must表示对过去推测要用完成时&…...
数值计算期末考试重点(一)(黄云清版教材)
1.误差的分类 2.绝对误差和绝对误差限 3.绝对误差和绝对误差限 例题(课后习题1.2) 4.有效数字 例题(课后习题1.6) 5.算法的数值稳定性 例题(课后习题1.9) 这个手算比较艰难,还是给计算机算吧&am…...
使用 pushy 热更新后 sentry 不能正常显示源码
问题 使用 Android Studio 打包后,上传使用 sentry 官网命令打包的 sourcemap 文件,sentry能正常显示异常位置源码。 使用 pushy 热更新之后,sentry 不能正常显示异常位置的源代码。 如下图: 问题原因: 使用 pushy …...
IntelliJ IDEA 远程调试
IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时,在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下,我们会通过打 Log 或者 Debug 的方式去定位并解决问题,两种方式各有利弊,今天就简要介绍下如何通过远程 Debug 的情况下…...
Java实现简单爬虫——爬取疫情数据
1.项目准备 在项目中使用到了jsoup和fastjson jsoup用于创建一个连接(绘画) 用于获取和解析HTML页面 而fastjson对数据进行一个格式化 在pom.xml导入坐标 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</a…...
大数据技术-Hadoop(一)Hadoop集群的安装与配置
目录 一、准备工作 1、安装jdk(每个节点都执行) 2、修改主机配置 (每个节点都执行) 3、配置ssh无密登录 (每个节点都执行) 二、安装Hadoop(每个节点都执行) 三、集群启动配置&a…...
04.HTTPS的实现原理-HTTPS的混合加密流程
04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程,包括非对称加密和对称加密两个阶段。首先,客户端向服务器发送请求…...
flutter插件开发-ios
flutter插件开发是一个重要的技能,拓展flutter与原生的通信,将一些公用的东西封装,给不同的项目使用。 阅读前置: flutter基本通道调用 objective-c基础语法 ios项目基础知识 目录 1、创建一个插件项目2、项目结构3、编写原生代码…...
【AI日记】24.12.29 kaggle 比赛 2-17
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset时间:6 小时 读书 书名:教育的本质时间:1 小时 律己 工作时间:优作息:…...
设计模式-创建型-工厂方法模式
什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是 创建型设计模式之一,目的是通过定义一个用于创建对象的接口,让子类决定实例化哪个类。简而言之,工厂方法模式通过延迟对象的创建过程到子类来…...
解决opencv在windows环境下读取中文图片名问题
在Windows系统下,cv2读取中文图片名时可能会报错,主要是因为OpenCV的imread函数在处理文件路径时,默认使用的是系统的编码格式,而Windows的默认编码可能与文件名的编码不匹配。具体原因包括: 编码不匹配:Wi…...
Apache Commons Pool :介绍与使用
Apache Commons Pool :介绍与使用 什么是 commons-pool2? commons-pool2 是 Apache Commons 提供的一个开源对象池实现框架。它旨在为应用程序提供通用的对象池支持,方便开发者管理资源(如数据库连接、网络连接等)复…...
sentinel-请求限流、线程隔离、本地回调、熔断
请求限流:控制QPS来达到限流的目的 线程隔离:控制线程数量来达到限流的目录 本地回调:当线程被限流、隔离、熔断之后、就不会发起远程调用、而是使用本地已经准备好的回调去提醒用户 熔断:熔断也叫断路器,当失败、或者…...
微信小程序 app.json 配置文件解析与应用
目录 一、什么是 app.json? 二、app.json 文件的基本结构 三、详细解析 app.json 配置项 1. pages:小程序页面路径配置 2. window:窗口样式配置 3. tabBar:底部标签栏配置 4. networkTimeout:网络请求超时配置 …...
C语言-共用体(联合体)
1.共用体(联合体) 1.共用体union是一个能在同一个存储空间存储不同类型数据的类型 2.共用体所占的内存长度等于其最长成员的长度。 3.同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用 4.共用体变量中起作用的成员是最后一次存放的成员ÿ…...
C++算法知识点
创建队列: 关于队列的一些常用方法: 创建栈: 将字符串换成整数:...
芝法酱学习笔记(2.3)——shardingsphere分库分表
一、前言 之前的例子中,我们以一个简化了的销售单报表查询,展示了大数据量查询时,在索引和变量类型层面可以做的一些优化。可我们发现,无论怎么优化,一次查询都要好几秒。 这是一个现实问题,只要一个系统用…...
vue3+vite+nginx打包
在开发环境下,已经可以正常地运行一个有增删改查功能的页面了,但如何把它发布到运行服务器呢?仍有许多的问题需要探索。 网上很多文章给了很大的帮助,但总是没有说明原理,对于像我这样的初学者来说,不知其…...
爬虫与反爬虫实现全流程
我选取的网页爬取的是ppt nba版 需要的工具:pycharm,浏览器 爬虫需要观察它的网页信息,然后开始首先爬取它的html,可以看到有人气,标题,日期,咨询 可以看到用get方法 import requests url"https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
