当前位置: 首页 > news >正文

【day20】集合深入探讨

模块19回顾

在深入探讨模块20之前,让我们回顾一下day19中的关键内容:

  1. Collection集合:单列集合的顶级接口,提供了addaddAllclearsizeisEmptyremovetoArraycontains等方法。
  2. 迭代器(Iterator):通过iterator方法获取,提供了hasNext()next()方法。在迭代集合时,不能随意修改集合长度,否则会抛出并发修改异常。
  3. 数据结构:栈(先进后出)、队列(先进先出)、数组(查询快,增删慢)、链表(查询慢,增删快)。
  4. ArrayList:特点包括元素有序、有索引、元素可重复、线程不安全。底层数据结构为数组,提供了addadd(index, element)removesizegetset等方法。自动扩容机制,扩容1.5倍。
  5. LinkedList:特点包括元素有序、有索引(通过方法支持,非本质索引)、元素可重复、线程不安全。底层数据结构为双向链表,提供了大量直接操作首尾元素的方法。
  6. 增强for循环:格式为for(元素类型 变量名:集合名或者数组名),遍历集合时使用迭代器,遍历数组时使用普通for循环。

模块20重点

本模块将深入探讨集合的高级应用,包括:

  1. 掌握Collections集合工具类的常用方法。
  2. 掌握泛型的使用。
  3. 了解HashSetLinkedHashSet的特点及使用。
  4. 了解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之后为数组+链表+红黑树,以提高查询效率。
在这里插入图片描述

  1. 每一个节点或是红色的,或者是黑色的

  2. 根节点必须是黑色

  3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的

  4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)

  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

在这里插入图片描述
https://www.cs.usfca.edu/~galles/visualization/RedBlack

第五章:Set集合

Set接口并没有对Collection接口进行功能上的扩充,而且所有的Set集合底层都是依靠Map实现
在这里插入图片描述

1.Set集合介绍

SetMap密切相关,Map的遍历需要先变成单列集合,只能变成Set集合。

2.HashSet集合的介绍和使用

HashSetSet接口的实现类,具有元素唯一、无序、无索引、线程不安全等特点。底层数据结构为哈希表。

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存储自定义类型如何去重复

自定义类型需要重写hashCodeequals方法来实现去重。

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集合工具类的常用方法、泛型的使用、HashSetLinkedHashSet的特点及使用,以及HashSet将元素去重的过程。这些都是Java集合框架中非常重要的知识点。

相关文章:

【day20】集合深入探讨

模块19回顾 在深入探讨模块20之前&#xff0c;让我们回顾一下day19中的关键内容&#xff1a; Collection集合&#xff1a;单列集合的顶级接口&#xff0c;提供了add、addAll、clear、size、isEmpty、remove、toArray、contains等方法。迭代器&#xff08;Iterator&#xff09…...

【英语语法】用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.绝对误差和绝对误差限 例题&#xff08;课后习题1.2&#xff09; 4.有效数字 例题&#xff08;课后习题1.6&#xff09; 5.算法的数值稳定性 例题&#xff08;课后习题1.9&#xff09; 这个手算比较艰难&#xff0c;还是给计算机算吧&am…...

使用 pushy 热更新后 sentry 不能正常显示源码

问题 使用 Android Studio 打包后&#xff0c;上传使用 sentry 官网命令打包的 sourcemap 文件&#xff0c;sentry能正常显示异常位置源码。 使用 pushy 热更新之后&#xff0c;sentry 不能正常显示异常位置的源代码。 如下图&#xff1a; 问题原因&#xff1a; 使用 pushy …...

IntelliJ IDEA 远程调试

IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时&#xff0c;在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下&#xff0c;我们会通过打 Log 或者 Debug 的方式去定位并解决问题&#xff0c;两种方式各有利弊&#xff0c;今天就简要介绍下如何通过远程 Debug 的情况下…...

Java实现简单爬虫——爬取疫情数据

1.项目准备 在项目中使用到了jsoup和fastjson jsoup用于创建一个连接(绘画) 用于获取和解析HTML页面 而fastjson对数据进行一个格式化 在pom.xml导入坐标 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</a…...

大数据技术-Hadoop(一)Hadoop集群的安装与配置

目录 一、准备工作 1、安装jdk&#xff08;每个节点都执行&#xff09; 2、修改主机配置 &#xff08;每个节点都执行&#xff09; 3、配置ssh无密登录 &#xff08;每个节点都执行&#xff09; 二、安装Hadoop&#xff08;每个节点都执行&#xff09; 三、集群启动配置&a…...

04.HTTPS的实现原理-HTTPS的混合加密流程

04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程&#xff0c;包括非对称加密和对称加密两个阶段。首先&#xff0c;客户端向服务器发送请求&#xf…...

flutter插件开发-ios

flutter插件开发是一个重要的技能&#xff0c;拓展flutter与原生的通信&#xff0c;将一些公用的东西封装&#xff0c;给不同的项目使用。 阅读前置&#xff1a; flutter基本通道调用 objective-c基础语法 ios项目基础知识 目录 1、创建一个插件项目2、项目结构3、编写原生代码…...

【AI日记】24.12.29 kaggle 比赛 2-17

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;6 小时 读书 书名&#xff1a;教育的本质时间&#xff1a;1 小时 律己 工作时间&#xff1a;优作息&#xff1a…...

设计模式-创建型-工厂方法模式

什么是工厂方法模式&#xff1f; 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是 创建型设计模式之一&#xff0c;目的是通过定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪个类。简而言之&#xff0c;工厂方法模式通过延迟对象的创建过程到子类来…...

解决opencv在windows环境下读取中文图片名问题

在Windows系统下&#xff0c;cv2读取中文图片名时可能会报错&#xff0c;主要是因为OpenCV的imread函数在处理文件路径时&#xff0c;默认使用的是系统的编码格式&#xff0c;而Windows的默认编码可能与文件名的编码不匹配。具体原因包括&#xff1a; 编码不匹配&#xff1a;Wi…...

Apache Commons Pool :介绍与使用

Apache Commons Pool &#xff1a;介绍与使用 什么是 commons-pool2&#xff1f; commons-pool2 是 Apache Commons 提供的一个开源对象池实现框架。它旨在为应用程序提供通用的对象池支持&#xff0c;方便开发者管理资源&#xff08;如数据库连接、网络连接等&#xff09;复…...

sentinel-请求限流、线程隔离、本地回调、熔断

请求限流&#xff1a;控制QPS来达到限流的目的 线程隔离&#xff1a;控制线程数量来达到限流的目录 本地回调&#xff1a;当线程被限流、隔离、熔断之后、就不会发起远程调用、而是使用本地已经准备好的回调去提醒用户 熔断&#xff1a;熔断也叫断路器&#xff0c;当失败、或者…...

微信小程序 app.json 配置文件解析与应用

目录 一、什么是 app.json&#xff1f; 二、app.json 文件的基本结构 三、详细解析 app.json 配置项 1. pages&#xff1a;小程序页面路径配置 2. window&#xff1a;窗口样式配置 3. tabBar&#xff1a;底部标签栏配置 4. networkTimeout&#xff1a;网络请求超时配置 …...

C语言-共用体(联合体)

1.共用体(联合体) 1.共用体union是一个能在同一个存储空间存储不同类型数据的类型 2.共用体所占的内存长度等于其最长成员的长度。 3.同一内存段可以用来存放几种不同类型的成员&#xff0c;但每一瞬时只有一种起作用 4.共用体变量中起作用的成员是最后一次存放的成员&#xff…...

C++算法知识点

创建队列&#xff1a; 关于队列的一些常用方法&#xff1a; 创建栈&#xff1a; 将字符串换成整数&#xff1a;...

芝法酱学习笔记(2.3)——shardingsphere分库分表

一、前言 之前的例子中&#xff0c;我们以一个简化了的销售单报表查询&#xff0c;展示了大数据量查询时&#xff0c;在索引和变量类型层面可以做的一些优化。可我们发现&#xff0c;无论怎么优化&#xff0c;一次查询都要好几秒。 这是一个现实问题&#xff0c;只要一个系统用…...

vue3+vite+nginx打包

在开发环境下&#xff0c;已经可以正常地运行一个有增删改查功能的页面了&#xff0c;但如何把它发布到运行服务器呢&#xff1f;仍有许多的问题需要探索。 网上很多文章给了很大的帮助&#xff0c;但总是没有说明原理&#xff0c;对于像我这样的初学者来说&#xff0c;不知其…...

爬虫与反爬虫实现全流程

我选取的网页爬取的是ppt nba版 需要的工具:pycharm,浏览器 爬虫需要观察它的网页信息,然后开始首先爬取它的html,可以看到有人气,标题,日期,咨询 可以看到用get方法 import requests url"https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2…...

别再手动装Office了!用Docker和LinuxServer.io镜像,5分钟搞定LibreOffice在线办公环境

5分钟极速部署&#xff1a;用Docker打造即开即用的LibreOffice云办公环境 你是否经历过这样的崩溃时刻&#xff1f;临时需要处理一份文档&#xff0c;却发现系统里的办公软件版本老旧、字体缺失&#xff1b;或是刚重装系统&#xff0c;又要花半小时等待Office安装进度条爬完。更…...

从Word2Vec到BERT:前馈网络在NLP词嵌入进化史中扮演了什么角色?

从Word2Vec到BERT&#xff1a;前馈网络如何重塑NLP词嵌入的技术基因 在自然语言处理&#xff08;NLP&#xff09;的发展历程中&#xff0c;词嵌入技术的进化犹如一场静默的革命。当我们回溯这段历史时会发现&#xff0c;前馈神经网络&#xff08;Feedforward Neural Network&am…...

5分钟搞定!用PySide2+Python快速搭建串口助手(附完整源码)

5分钟搞定&#xff01;用PySide2Python快速搭建串口助手&#xff08;附完整源码&#xff09; 1. 为什么选择PySide2开发串口工具&#xff1f; 在嵌入式开发和物联网项目中&#xff0c;串口调试工具就像工程师的"瑞士军刀"。传统方案如C/QT开发周期长&#xff0c;而Py…...

Anlogic FD工具深度体验:如何用eMCU软核实现SF1芯片的PSRAM控制器设计

Anlogic FD工具实战&#xff1a;基于eMCU软核的PSRAM控制器设计进阶指南 当FPGA工程师需要在资源受限的SF1芯片上实现高性能存储控制时&#xff0c;Anlogic Future Dynasty&#xff08;FD&#xff09;工具链中的eMCU软核与PSRAM控制器组合提供了绝佳的解决方案。不同于基础教程…...

Joy-Con Toolkit:突破官方限制的任天堂手柄全能控制工具

Joy-Con Toolkit&#xff1a;突破官方限制的任天堂手柄全能控制工具 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 重新定义手柄控制&#xff1a;从消费级到开发级的跨越 Joy-Con控制器作为任天堂Switch的核心…...

5个颠覆性智能测试提升技巧:Claude Code自动化测试生成全解析

5个颠覆性智能测试提升技巧&#xff1a;Claude Code自动化测试生成全解析 【免费下载链接】claude-code Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining …...

告别显卡驱动残留困扰:Display Driver Uninstaller的深度清理全解析

告别显卡驱动残留困扰&#xff1a;Display Driver Uninstaller的深度清理全解析 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...

Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37%

Llama-3.2V-11B-cot一文详解&#xff1a;low_cpu_mem_usage对加载速度提升37% 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡RTX 4090环境深度优化。该工具通过一系列技术创新&#xff0c;显著提升…...

REFramework技术实战指南:问题解决与架构优化

REFramework技术实战指南&#xff1a;问题解决与架构优化 【免费下载链接】REFramework REFramework 是 RE 引擎游戏的 mod 框架、脚本平台和工具集&#xff0c;能安装各类 mod&#xff0c;修复游戏崩溃、卡顿等问题&#xff0c;还有开发者工具&#xff0c;让游戏体验更丰富。 …...

【由浅入深探究langchain】第十七集-构建你的首个 RAG 知识库助手(从文档索引到检索增强生成)

前言在大语言模型&#xff08;LLM&#xff09;爆火的今天&#xff0c;我们常常会被 GPT 或 Claude 展现出的博学所惊叹。然而&#xff0c;当你试着问它“我公司昨晚新发布的财务报表数据是多少&#xff1f;”或者“我上周在笔记里写的某个私人计划是什么&#xff1f;”时&#…...