【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…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...