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

Javase 基础加强 —— 04 集合2.0

本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。

在这里插入图片描述

01 Set 系列集合

无序、不重复、无索引

  • HashSet:无序、不重复、无索引
  • LinkedHashSet有序、不重复、无索引
  • TreeSet排序、不重复、无索引
package SetDemo;import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;public class HashSetDemo1 {public static void main(String[] args) {//HashSet 无序,不重复,无索引Set<String> set = new HashSet<>();set.add("deepseek");set.add("ChatGPT");set.add("ChatGPT");set.add("豆包");set.add("元宝");set.add("文心一言");System.out.println(set);//LinkedHashSet 有序,不重复,无索引//TreeSet 默认升序,不重复,无索引Set<Double> treeSet = new TreeSet<>();treeSet.add(3.14);treeSet.add(5.26);treeSet.add(0.25);treeSet.add(9.99);treeSet.add(6.66);treeSet.add(19.88);System.out.println(treeSet);}
}

在这里插入图片描述

注:Set要用到的常用方法,基本上就是Collection提供的!!自己几乎没有额外新增一些常用功能!

02 HashSet 集合的底层原理

① 哈希值

哈希值就是一个int类型的随机值,Java中每个对象都有一个哈希值。

Java中的所有对象,都可以调用Obejct类提供的HashCode方法,返回该对象自己的哈希值。

String s1 = "abc";
String s2 = "zlg";System.out.println(s1.hashCode());
System.out.println(s2.hashCode());

同一个对象多次调用hashCode()方法返回的哈希值是相同的。

不同的对象,它们的哈希值大概率不相等,但也可能会相等(哈希碰撞)

② 哈希表

在这里插入图片描述

JDK8之前的哈希表:数组+链表

在这里插入图片描述

JDK8开始,哈希表=数组+链表+红黑树

注:JDK8开始,当链表长度超过8且数组长度>=64时,自动将链表转成红黑树。

③ 红黑树

红黑树,就是自平衡的排序二叉树。

在这里插入图片描述

03 案例:HashSet 集合的元素去重操作

需求:创建一个存储学生对象的集合,存储的多个学生对象的成员变量值相同时,我们就认为是同一个对象,要求只保留一个。

分析:

① 定义学生类,创建HashSet集合对象,创建学生对象

② 添加学生到集合

Student.java

package SetDemo;import java.util.Objects;public class Student<toString> {private String name;private int age;private String address;private String phone;public Student() {}public Student(String name, int age, String address, String phone) {this.name = name;this.age = age;this.address = address;this.phone = phone;}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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +", phone='" + phone + '\'' +'}' + '\n';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student<?> student = (Student<?>) o;return age == student.age && Objects.equals(name, student.name) && Objects.equals(address, student.address) && Objects.equals(phone, student.phone);}@Overridepublic int hashCode() {return Objects.hash(name, age, address, phone);}
}

HashSetDemo.java

package SetDemo;import java.util.HashSet;
import java.util.Set;public class HashSetDemo2 {public static void main(String[] args) {Student s1 = new Student("张三", 18, "北京", "123456");Student s2 = new Student("李四", 19, "上海", "100863");Student s3 = new Student("张三", 18, "北京", "123456");Student s4 = new Student("李四", 19, "上海", "100863");Set<Student> set = new HashSet<>(); //Alt + Enter解决包调用问题set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);}
}

在这里插入图片描述

http://www.xdnf.cn/news/276859.html

相关文章:

  • Linux:web服务
  • 第14章:阿凡达的复兴与潘多拉的新生
  • 三、A2DP协议详解
  • 高可用架构设计——服务接口高可用
  • 北极花 APP:开启生物多样性调查新模式,助力生态保护
  • Lesson 16 A polite request
  • bc 命令
  • 系统架构设计师:设计模式——行为设计模式
  • Go语言chan底层原理
  • el-input Vue 3 focus聚焦
  • 无人机视觉:连接像素与现实世界 —— 像素与GPS坐标双向转换指南
  • 【Unity】使用XLua进行热修复
  • Nginx 核心功能之正反代理
  • 高等数学第三章---微分中值定理与导数的应用(§3.6 函数图像的描绘§3.7 曲率)
  • 开源 FEM(有限元分析)工程
  • 工业元宇宙:从虚拟仿真到虚实共生
  • C++负载均衡远程调用学习之实时监测与自动发布功能
  • Day110 | 灵神 | 二叉树 | 根到叶路径上的不足节点
  • Qt6 学习指南:前言+安装基本依赖
  • C++名称空间
  • Python 浮点数(float)类型详解
  • 苍穹外卖12
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.4 数据重复与去重(IDENTITY COLUMN/UNIQUE约束)
  • 什么是unordered_set?用大白话说
  • 智能工厂自主优化:从局部调优到全局演进
  • NPP库中libnpps模块介绍
  • 【时时三省】(C语言基础)怎样定义和引用一维数组
  • C++23 std::tuple与其他元组式对象的兼容 (P2165R4)
  • SpringMVC-第二章之RequestMapping注解详解
  • 【ArcGIS微课1000例】0144:沿线或多边形要素添加折点,将曲线线段(贝塞尔、圆弧和椭圆弧)替换为线段。