菜鸟之路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);}}
}

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

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

相关文章

Hive:基本查询语法

和oracle一致的部分 和oracle不一样的部分 排序 oracle中,在升序排序中&#xff0c;NULL 值被视为最大的值&#xff1b;在降序排序中&#xff0c;NULL 值被视为最小的值。 在MySQL中&#xff0c;NULL 被视为小于任何非空值。 在Hive中, NULL是最小的; Hive除了可以用order…

Python GUI 开发 | PySide6 辅助工具简介

关注这个框架的其他相关笔记&#xff1a;Python GUI 开发 | PySide6 & PyQt6 学习手册-CSDN博客 在上一章中&#xff0c;我们介绍了如何搭建 PySide6 & PyQt6 的开发环境。在搭建环境的时候我们配置了几个几个快捷工具&#xff0c;很多小伙伴可能都不知道是干啥用的。那…

hive:数据导入,数据导出,加载数据到Hive,复制表结构

hive不建议用insert,因为Hive是建立在Hadoop之上的数据仓库工具&#xff0c;主要用于批处理和大数据分析&#xff0c;而不是为OLTP&#xff08;在线事务处理&#xff09;操作设计的。INSERT操作会非常慢 数据导入 命令行界面:建一个文件 查询数据>>复制>>粘贴到新…

HarmonyOS:ForEach:循环渲染

一、前言 ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为List组件。 API参数说明见&#xff1a;ForEa…

基于PostgreSQL的自然语义解析电子病历编程实践与探索(上)

一、引言 1.1研究目标与内容 本研究旨在构建一个基于 PostgreSQL 的自然语义解析电子病历编程体系,实现从电子病历文本中提取结构化信息,并将其存储于 PostgreSQL 数据库中,以支持高效的查询和分析。具体研究内容包括: 电子病历的预处理与自然语言处理:对电子病历文本进…

安装 docker 详解

在平常的开发工作中&#xff0c;我们经常需要部署项目。随着 Docker 容器的出现&#xff0c;大大提高了部署效率。Docker 容器包含了应用程序运行所需的所有依赖&#xff0c;避免了换环境运行问题。可以在短时间内创建、启动和停止容器&#xff0c;大大提高了应用的部署速度&am…

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…

初阶1 入门

本章重点 C的关键字命名空间C的输入输出缺省参数函数重载引用内联函数auto关键字基于范围的for循环指针的空值nullptr 1.C的关键字 c总共有63个关键字&#xff0c;其中包含c语言的32个 这些关键字不需要特意去记&#xff0c;在我们日后写代码的过程中会慢慢用到并记住。 2.…

动态规划DP 数字三角形模型(模型分析+例题分析+C++代码实现)(数字三角形、摘花生、最低通行费用、方格取数、传纸条)

总体概览 数字三角形 原题链接 AcWing 898.数字三角形 题目描述 给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路…

C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

力扣hot100链表总结-day0127

目录 206.反转链表&#xff08;0127&#xff09; 19.删除链表的倒数第N个节点&#xff08;0127&#xff09; 206.反转链表&#xff08;0127&#xff09; 总结&#xff1a; 1.迭代实现&#xff1a;将给出的头节点head固定&#xff0c;始终把head的下一个节点给安装成新头节点…

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度

随着全球化的不断深入和市场需求的快速变化&#xff0c;企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本&#xff0c;并确保信息的透明度&#xff0c;成为了各大行业亟待解决的问题。而增强现实&#xff08;AR&#xff09;技术&#xff0c;特别…

力扣111二叉树的最小深度(DFS)

Problem: 111. 二叉树的最小深度 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲望求出最短的路径&#xff0c;先可以记录一个变量minDepth&#xff0c;同时记录每次当前节点所在的层数currentDepth 2.在递的过程中&#xff0c;每次递一层&#xff0c;也即使当前又往下走…

python -m pip和pip的主要区别

python -m pip和pip的主要区别在于它们与Python环境的关联方式和安装路径。‌ ‌与Python环境的关联方式‌&#xff1a; pip 是直接使用命令行工具来安装Python包&#xff0c;不指定特定的Python解释器。如果系统中存在多个Python版本&#xff0c;可能会导致安装的包被安装到…

RHEL封闭环境部署zabbix

背景&#xff1a;client端操作系统升级.然后安装了该操作系统基础版本的zabbix-client&#xff0c;与原来的zabbix-server版本不匹配&#xff0c;需要重新部署一台zabbix-server zabbix-server GUI上该client采集不到系统数据 说明&#xff1a;下文的 x.x.x.x 代表服务端的IP…

vim 中粘贴内容时提示: -- (insert) VISUAL --

目录 问题现象&#xff1a;解决方法&#xff1a;问题原因&#xff1a; 问题现象&#xff1a; 使用 vim 打开一个文本文件&#xff0c;切换到编辑模式后&#xff0c;复制内容进行粘贴时有以下提示&#xff1a; 解决方法&#xff1a; 在命令行模式下禁用鼠标支持 :set mouse …

数据结构与算法-要点整理

知识导图: 一、数据结构 包含:线性表(数组、队列、链表、栈)、散列表、树(二叉树、多路查找树)、图 1.线性表 数据之间就是“一对一“的逻辑关系。 线性表存储数据的实现方案有两种,分别是顺序存储结构和链式存储结构。 包含:数组、队列、链表、栈。 1.1 数组…

二级C语言题解:统计奇偶个数以及和与差、拼接字符串中数字并计算差值、提取字符串数组中单词尾部字母

目录 一、程序填空 --- 统计奇偶个数以及和与差 题目 分析 二、程序修改 --- 拼接字符串中数字并计算差值 题目 分析 三、程序设计题 --- 提取字符串数组中单词尾部字母 题目 分析 前言&#xff1a; 本节讲解C语言二级的统计奇偶个数以及和与差、拼接字符串中数字并计…

【四川乡镇界面】图层shp格式arcgis数据乡镇名称和编码2020年wgs84无偏移内容测评

本文将详细解析标题和描述中提到的IT知识点&#xff0c;主要涉及GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;技术&#xff0c;以及与之相关的文件格式和坐标系统。 我们要了解的是"shp"格式&#xff0c;这是一种广泛用于存储…

关于MySQL InnoDB存储引擎的一些认识

文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的&#xff1f;1.1 MySQL的存储引擎有哪些&#xff1f;1.2 MyIsam和InnoDB有什么区别&#xff1f; 2.MySQL表的结构是什么&#xff1f;2.1 行结构是什么样呢&#xff1f;2.1.1 NULL列表&#xff1f;2.1.2 char和varc…