菜鸟之路Day09一一集合进阶(二)
菜鸟之路Day09一一集合进阶(二)
作者:blue
时间:2025.1.27
文章目录
- 菜鸟之路Day09一一集合进阶(二)
- 0.概述
- 1.泛型
- 1.1泛型概述
- 1.2泛型类
- 1.3泛型方法
- 1.4泛型接口
- 1.5泛型通配符
- 2.Set系列集合
- 2.1遍历方式
- 2.2HashSet
- 2.3LinkedHashSet
- 2.4TreeSet
0.概述
内容学习至黑马程序员BV17F411T7Ao,无论如何,今天是值得铭记的一天,我们终于完结了200集的上部。下部漫漫,我们再接再厉。
1.泛型
1.1泛型概述
泛型:是JDK5中引入的新特性,可以在编译阶段约束操作的数据类型,并进行检查
泛型的格式:<数据类型>
注意:泛型只能支持引用数据类型(原因:数据在装入集合的过程中,会做一个泛型的擦除,也就是说在集合中实际存储的是Object类型的数据,而引用数据类型是继承Object的,这里利用了多态,所以这里必须使用引用数据类型。指定了泛型的具体类型后,传入数据时,可以传入该类类型或其子类类型)
泛型的好处:1.统一了数据类型;2.把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能够确定下来
如果不写泛型,类型默认是Object
1.2泛型类
使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
比如下面我们手写一个MyArrayList
import java.util.Arrays;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);}
}
使用一下我们自己写的MyArrayList
public class GenericsDemo1 {public static void main(String[] args) {MyArrayList<Integer> list = new MyArrayList<>();list.add(123);list.add(234);list.add(345);list.add(456);System.out.println(list.get(3));}
}
1.3泛型方法
方法中形参类型不确定时:方案①:使用类名后面定义的泛型(所有方法都能用);方案②:在方法申明上定义自己的泛型(只有本方法能用)
泛型方法的格式:
/*
修饰符 <类型> 返回值类型 方法名(类型 变量名){方法体
}
*/
练习:定义一个工具类:ListUtil
类中定义一个静态方法addAll,用来添加多个集合的元素
package Generics;import java.util.ArrayList;public class ListUtil {private ListUtil(){}//工具类,私有化其构造方法//静态方法的话,泛型写在static之后public static<E> void addAll(ArrayList<E> list,E e1,E e2,E e3,E e4){list.add(e1);list.add(e2);list.add(e3);list.add(e4);}
}
1.4泛型接口
/*修饰符 interface 接口名<类型>{}*/
泛型接口的重点在于:如何使用一个带泛型的接口
方式1:实现类给出具体的类型
public class MyArrayList implements List<String>
方式2:实现类延续泛型,创建对象时再确定
public class MyArrayList<E> implement List<E>
MyArrayList<String> list = new MyArrayList<>();
1.5泛型通配符
/*?也表示不确定类型他可以进行类型的限定? extends E:表示可以传递E或者E所有的子类类型? super E:表示可以传递E或者E所有父亲类型应用场景:1.如果我们在定义类,方法,接口的时候,如果类型不确定,就可以定义泛型类,泛型方法,泛型接口2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以使用泛型的通配符泛型的通配符:关键点:可以限定类型的范围
*/
package Generics;import java.util.ArrayList;public class GenericsDemo2 {public static void main(String[] args) {ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();method(list1);method(list2);method(list3);//method(new ArrayList<Integer>());这个就不行}public static void method(ArrayList<? extends Ye> list){}
}
class Ye {}
class Fu extends Ye{}
class Zi extends Fu {}
2.Set系列集合
Set系列集合:添加的元素是无序,不重复,无索引的
Set集合的实现类特点
| 名字 | 特点 |
|---|---|
| HashSet | 无序,不重复,无索引 |
| LinkedHashSet | 有序,不重复,无索引 |
| TreeSet | 可排序,不重复,无索引 |
2.1遍历方式
Set还是属于Collection系列的所以它的API与Collection是一样,不同是其遍历方式,因为它是无索引的,所以只能用Collection通用的遍历方式,迭代器,增强for,Lambada表达式
package SetDemo;import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.function.Consumer;public class SetDemo1 {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("aaa");set.add("aaa");//利用set去重set.add("bbb");set.add("ccc");set.add("ddd");//迭代器遍历Iterator<String> it = set.iterator();while(it.hasNext()){System.out.println(it.next());}//增强forfor(String i:set){System.out.println(i);}//Lambda表达式set.forEach((String s)->{System.out.println(s);});}
}
2.2HashSet
HashSet集合的底层原理采取哈希表存取数据
哈希表是一种对于增删改查数据性能都较好的结构
哈希值
根据hashCode方法算出来的int类型的整数整数
该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
一般情况下,会重写hashCode方法,利用对象内部属性值计算哈希值
注意:
如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
如果重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
在小部分情况下,不同属性值或者不同地址值计算出来的哈希值也有可能一样。(哈希碰撞)
练习:
需求
package SetDemo;import java.util.HashSet;public class HashSetDemo1 {public static void main(String[] args) {HashSet<Student> set = new HashSet<>();Student stu1 = new Student("zhangsan",11);Student stu2 = new Student("lisi",12);Student stu3 = new Student("wangwu",13);set.add(stu1);set.add(stu2);set.add(stu3);//这个添加是失败的,因为他是根据hashCode来去重的,我们重写了hashCode方法,使得属性一样的hashCode是一致的Student stu4 = new Student("zhangsan",11);System.out.println(set.add(stu4));//falseSystem.out.println(stu1.hashCode());System.out.println(stu4.hashCode());for(Student i : set){System.out.println(i);}}
}
2.3LinkedHashSet
有序,不重复,无索引
这里的有序指的是保证存储和取出的元素顺序是一致的,因为有序的要求更复杂,所以它的效率比HashSet的效率低一点
原理:底层数据结构依然是哈希表,只是每个元素又额外多了一个双链表的机制记录存储的顺序
打印出来的顺序是,按照我们添加的顺序
public class LinkedHashSetDemo1 {public static void main(String[] args) {LinkedHashSet<Student> set = new LinkedHashSet<>();Student stu1 = new Student("zhangsan",11);Student stu2 = new Student("lisi",12);Student stu3 = new Student("wangwu",13);set.add(stu1);set.add(stu2);set.add(stu3);System.out.println(set);}
}
2.4TreeSet
TreeSet,不重复,无索引,可排序
可排序:按照元素的默认规则(有小到大)排序
TreeSet集合的底层是基于红黑树的数据结构实现排序的,增删改查的性能都比较好
//基本使用
package SetDemo;import java.util.Iterator;
import java.util.TreeSet;
import java.util.function.Consumer;public class TreeSetDemo1 {public static void main(String[] args) {TreeSet<Integer> ts = new TreeSet<>();ts.add(2);ts.add(1);ts.add(5);ts.add(4);ts.add(3);System.out.println(ts);//自动排序//增强forfor(Integer i : ts){System.out.print(i+" ");}System.out.println();//迭代器Iterator<Integer> it = ts.iterator();while(it.hasNext()){System.out.print(it.next()+" ");}System.out.println();//Lambadats.forEach((Integer i)->{System.out.print(i+" ");});}
}
TreeSet集合默认的规则
对于数值类型:Integer,Double,默认按照从小到大的顺序排序
对于字符,字符串类型:按照字符在ASCII码表中的数字升序进行排序
自定义类型如何排序
方式一:自然排序/默认排序:javabean类实现Comparable接口指定比较规则
package SetDemo;import java.util.Objects;public class Student implements Comparable<Student>{private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {//按照年龄大小排序return this.getAge()-o.getAge();}
}
package SetDemo;import java.util.TreeSet;public class TreeSetDemo2 {public static void main(String[] args) {Student stu1 = new Student("zhangsan",11);Student stu2 = new Student("lisi",12);Student stu3 = new Student("wangwu",13);TreeSet<Student> ts = new TreeSet<>();ts.add(stu1);ts.add(stu2);ts.add(stu3);System.out.println(ts);}
}
方式二:比较器排序,创建TreeSet对象的时候,传递比较器Comparator指定规则
package SetDemo;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo3 {public static void main(String[] args) {//按照长度排序,如果一样长则按照首字母排序TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {@Override/*o1:表示当前要添加的元素o2:表示已经在红黑树中的元素返回值的规则和之前是一样的*/public int compare(String o1, String o2) {//按照长度排序int i = o1.length()-o2.length();//如果一样长则按照首字母排序i=i==0?o1.compareTo(o2):i;//String的内置比较方法return i;}});ts.add("c");ts.add("ab");ts.add("df");ts.add("qwer");}
}
改为Lambada
package SetDemo;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo3 {public static void main(String[] args) {//按照长度排序,如果一样长则按照首字母排序TreeSet<String> ts = new TreeSet<>((String o1, String o2) ->{//按照长度排序int i = o1.length()-o2.length();//如果一样长则按照首字母排序i=i==0?o1.compareTo(o2):i;//String的内置比较方法return i;});ts.add("c");ts.add("ab");ts.add("df");ts.add("qwer");for (String i:ts){System.out.println(i);}}
}相关文章:
菜鸟之路Day09一一集合进阶(二)
菜鸟之路Day09一一集合进阶(二) 作者:blue 时间:2025.1.27 文章目录 菜鸟之路Day09一一集合进阶(二)0.概述1.泛型1.1泛型概述1.2泛型类1.3泛型方法1.4泛型接口1.5泛型通配符 2.Set系列集合2.1遍历方式2.2HashSet2.3LinkedHashSet2.4TreeSet 0.概述 内…...
写在新年之际
各位关注我的小伙伴们,大家好! 在这新年来临之际,首先祝大家新年快乐!愿新的一年充满机遇与收获,愿我们在各自的领域中继续突破和成长! 回顾2024年,这是充满变革的一年,不仅世界局…...
【shell工具】编写一个批量扫描IP地址的shell脚本
批量扫描某个网段中的主机(并发) 创建目录编写脚本文件 mkdir /root/ip_scan_shell/ touch /root/ip_scan_shell/online_server.txt touch /root/ip_scan_shell/offline_server.txt touch /root/ip_scan_shell/ip_scan.sh写入下面shell到脚本文件中…...
分库分表后如何进行join操作
在分库分表后的系统中,进行表之间的 JOIN 操作比在单一数据库表中复杂得多,因为涉及的数据可能位于不同的物理节点或分片中。此时,传统的 SQL JOIN 语句不能直接用于不同分片的数据,以下是几种处理这样的跨分片 JOIN 操作的方法&a…...
004 mybatis基础应用之全局配置文件
文章目录 配置内容properties标签typeAlias标签mappers标签 配置内容 SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler…...
vim如何设置制表符表示的空格数量
:set tabstop4 设置制表符表示的空格数量 制表符就是tab键,一般默认是四个空格的数量 示例: (vim如何使设置制表符表示的空格数量永久生效:vim如何使相关设置永久生效-CSDN博客)...
基于dlib/face recognition人脸识别推拉流实现
目录 一.环境搭建 二.推拉流代码 三.人脸检测推拉流 一.环境搭建 1.下载RTSP服务器MediaMTX与FFmpeg FFmpeg是一款功能强大的开源多媒体处理工具,而MediaMTX则是一个轻量级的流媒体服务器。两者结合,可以实现将本地视频或者实时摄像头画面推送到RTSP流,从而实现视频…...
LangChain:使用表达式语言优化提示词链
在 LangChain 里,LCEL 即 LangChain Expression Language(LangChain 表达式语言),本文为你详细介绍它的定义、作用、优势并举例说明,从简单示例到复杂组合示例,让你快速掌握LCEL表达式语言使用技巧。 定义 …...
多线程编程杂谈( 下)
问题 是否存在其它中途线程退出的方法? 通过调用Linux系统函数 pthread_cancel(...) 可中途退出线程 Linux 提供了线程取消函数 取消状态 接受取消状态: PTHREAD_CANCEL_ENABLE拒绝取消状态: PTHREAD_CANCEL_DISABLE 取消请求 延迟取消: PTHREAD_CANCEL_DEFERR…...
rdma-core debug
export MLX5_DEBUG_MASK0xff export MLX5_DEBUG_FILE/tmp/mlx5.txt git clone https://github.com/linux-rdma/rdma-core.git cd rdma-core ./build.sh 修改build/CMakeCache.txt MLX5_DEBUG:BOOLTRUE function install_rdma_core {local dir/swgwork/cmi/rdma-core/buil…...
电脑无法开机,重装系统后没有驱动且驱动安装失败
电脑无法开机,重装系统后没有驱动且驱动安装失败 前几天电脑突然坏了,电脑卡住后,强制关机,再开机后开机马上就关机。尝试无数次开机后失败,进入BIOS界面,发现已经没有Windows系统了。重新安装系统后&…...
【Java数据结构】了解排序相关算法
基数排序 基数排序是桶排序的扩展,本质是将整数按位切割成不同的数字,然后按每个位数分别比较最后比一位较下来的顺序就是所有数的大小顺序。 先对数组中每个数的个位比大小排序然后按照队列先进先出的顺序分别拿出数据再将拿出的数据分别对十位百位千位…...
机器学习-线性回归(对于f(x;w)=w^Tx+b理解)
一、𝑓(𝒙;𝒘) 𝒘T𝒙的推导 学习线性回归,我们那先要对于线性回归的表达公示,有所认识。 我们先假设空间是一组参数化的线性函数: 其中权重向量𝒘 ∈ R𝐷 …...
RAG与GraphRAG的区别
文章目录 前言RAG 的特点核心思想数据结构优势局限性应用场景 GraphRAG 的特点核心思想数据结构优势局限性应用场景 如何选型示例场景多跳推理问题推荐系统中的复杂关系社交网络中的影响力分析 总结 前言 RAG (Retrieval-Augmented Generation) 和 GraphRAG (Graph-Based Retr…...
Ubuntu环境通过Ollama部署DeepSeek-R1模型教程
Ollama 是一个专注于简化模型部署和推理的工具,特别适合在生产环境中快速部署和运行模型。 以下是如何使用 Ollama 来安装、部署和使用模型的步骤: 一. 安装 Ollama 首先,你需要安装 Ollama。Ollama 通常支持多种平台(如 Linux、…...
使用Ollama 在Ubuntu运行deepseek大模型:以deepseek-r1为例
deepseek大模型上热搜啦! 咱们来亲身感受下DeepSeek模型的魅力吧! 整个操作流程非常简单方便,只需要2步,先安装Ollama,然后执行大模型即可。 支持的deepseek-r1模型 deepseek-r1 DeepSeek-R1-Distill-Qwen-1.5B …...
【中间件快速入门】什么是Redis
现在后端开发会用到各种中间件,一不留神项目可能在哪天就要用到一个我们之前可能听过但是从来没接触过的中间件,这个时候对于开发人员来说,如果你不知道这个中间件的设计逻辑和使用方法,那在后面的开发和维护工作中可能就会比较吃…...
poi在word中打开本地文件
poi版本 5.2.0 方法1:使用XWPFFieldRun(推荐) 比如打开当前相对路径的aaaaa.docx XWPFFieldRun run paragraph.createFieldRun();CTRPr ctrPr run.getCTR().addNewRPr();CTFonts font ctrPr.addNewRFonts();// 设置字体font.setAscii(&quo…...
27. C语言 强制类型转换详解
本章目录: 前言强制类型转换(Type Casting)强制类型转换的语法示例1:将整数转换为浮点数输出结果: 代码解析: 整数提升(Integer Promotion)示例2:整数提升输出结果: 代码…...
【1】阿里面试题整理
[1]. Kafka如何保证数据一致性? Kafka主要通过副本机制、ISR机制、持久化机制以及事务机制等多种方式共同保证了数据的一致性。副本机制是Kafka确保数据一致性的基础,使用ISR(In-Sync Replica)机制来处理副本之间的同步,将消息持久化到硬盘中…...
MySQL知识点总结(十三)
执行逻辑备份要具备哪些条件,其优缺点在哪。 逻辑备份是温备,创建逻辑备份文件时,MySQL服务器必须处于运行状态,其他应用程序在逻辑备份期间不能修改但可以执行读取操作。逻辑备份会把表结构和数据转换为SQL语句保存。 逻辑备份…...
linux 环境安装 dlib 的 gpu 版本
默认使用 pip 安装的 dlib 是不使用 gpu 的 在国内社区用百度查如何安装 gpu 版本的 dlib 感觉信息都不太对,都是说要源码编译还有点复杂 还需要自己安装 cuda 相关的包啥的,看着就头大 于是想到这个因该 conda 自己就支持了吧,然后查了一下…...
Meta 计划 2025 年投资 650 亿美元推动 AI 发展
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
第05章 12 可视化热量流线图一例
下面是一个使用VTK(Visualization Toolkit)和C编写的示例代码,展示如何在一个厨房模型中可视化热量流线图,并按照热量传递速度着色显示。这个示例假设你已经安装了VTK库,并且你的开发环境已经配置好来编译和运行VTK程序…...
微信小程序压缩图片
由于wx.compressImage(Object object) iOS 仅支持压缩 JPG 格式图片。所以我们需要做一下特殊的处理: 1.获取文件,判断文件是否大于设定的大小 2.如果大于则使用canvas进行绘制,并生成新的图片路径 3.上传图片 async chooseImage() {let …...
2025_1_27 C语言内存,递归,汉诺塔问题
1.c程序在内存中的布局 代码段(Code Segment) 位置:通常位于内存的最低地址。 用途:存储程序的可执行指令。 特点:只读,防止程序运行时被修改。数据段(Data Segment) 位置…...
K8s运维管理平台 - xkube体验:功能较多
目录 简介Lic安装1、需要手动安装MySQL,**建库**2、启动命令3、[ERROR] GetNodeMetric Fail:the server is currently unable to handle the request (get nodes.metrics.k8s.io qfusion-1) 使用总结优点优化 补充1:layui、layuimini和beego的详细介绍1.…...
舆情系统的情报搜索功能
引言 随着信息技术的发展和网络媒体的快速发展,舆情监测已成为各行各业不可或缺的工具。舆情系统中的情报搜索功能,作为其核心组成部分,能够帮助用户迅速、全面地捕捉互联网、社交平台、新闻媒体等渠道中的各类信息和舆论动态。情报搜索不仅提…...
简易CPU设计入门:控制总线的剩余信号(二)
项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 CSDN文章:下载本项目代码 上述链接为本项目…...
[创业之路-270]:《向流程设计要效率》-2-企业流程架构模式 POS架构(规划、业务运营、支撑)、OES架构(业务运营、使能、支撑)
目录 一、POS架构 二、OES架构 三、POS架构与OES架构的差异 四、各自的典型示例 POS架构典型示例 OES架构典型示例 示例分析 五、各自的典型企业 POS架构典型企业 OES架构典型企业 分析 六、各自典型的流程 POS架构的典型流程 OES架构的典型流程 企业流程架构模式…...
