黑马教程强化day2-1

目录

  • 一、Set集合
    • 1.Set集合特点
    • 2.Set集合分类
    • 3.hashSet底层原理:(基于哈希表存储数据的)
      • 代码演示
    • 5.hashSet集合元素的去重操作(有些情况搞不动)
      • 代码演示
    • 6.LinkedHashSet的底层原理(不常用,所以没有代码演示)
    • 7.TreeSet的底层原理
      • 代码演示

一、Set集合

1.Set集合特点

无序:添加数据的顺序和获取出的数据顺序不一致;不重复;不索引。

2.Set集合分类

  • Hashset:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:排序(从小到大派、不重复、无索引

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

3.hashSet底层原理:(基于哈希表存储数据的)

(1)哈希值:就是一个int类型的随机值,java中每个对象都有一个哈希值。java中的所有对象,都可以调用Object类提供的hashCode方法,返回该对象的哈希值。
格式:

public  int hashCode():

(2)对象哈希值的特点:

  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的。
  • 不同的对象,它们的哈希值大概率不相等,但也有可能会相等(哈希碰撞).

(3)哈希表:

  • JDK8之前:哈希表=数组+链表
  • JDK8开始:哈希表=数组+链表+红黑树
  • 哈希表是一种增删改查数据,性能都比较好的数据结构。

(4)过程:(jDK8之前)

  • 1.使用HashSet创建一个默认长度为16的数组,默认加载因子为0.75,数组名table。(注意:ArrayList创建的长度是10)
  • 2.使用元素的哈希值对数组的长度做运算计算出应存入的位置。
  • 3.判断当前位置是否为null,如果是null直接存入
  • 4.如果不为null,表示有元素,则调用equals方法比较,相等,不存;不相等,存入;
  • 注意:JDK8之前,新元素存入数组,占老元素位置,老元素挂下面;JDK8之后,新元素直接挂在老元素下面。
  • 5.如果存入的数据超过16*0.75,就会扩容为原来的2倍。
  • JDK8之后,当链表长度超过8,且数组长度》=64时,自动将链表转成红黑树。

红黑树:就是可以自平衡的二叉树,红黑树是一种增删改查数据性能相对较好的结构。

代码演示

package com.item.demo1hashset;import java.util.*;
public class SetDemo1 {public static void main(String[] args) {Set<String> set =new HashSet<>();//一行经典的代码set.add("java");set.add("java");set.add("鸿蒙");set.add("鸿蒙");set.add("电商设计");set.add("电商设计");set.add("新媒体");set.add("大数据");System.out.println(set);//[java, 新媒体, 鸿蒙, 电商设计, 大数据]System.out.println("============");Set<String> set1 =new LinkedHashSet<>();set1.add("java");set1.add("java");set1.add("鸿蒙");set1.add("鸿蒙");set1.add("电商设计");set1.add("电商设计");set1.add("新媒体");set1.add("大数据");System.out.println(set1);//[java, 鸿蒙, 电商设计, 新媒体, 大数据]System.out.println("============");Set<Double> set2 =new TreeSet<>();//一行经典的代码set2.add(5.1);set2.add(5.1);set2.add(1.0);set2.add(2.0);set2.add(1.0);set2.add(3.0);set2.add(2.0);set2.add(5.4);System.out.println(set2);//[1.0, 2.0, 3.0, 5.1, 5.4]System.out.println("=============");String s1="acd";String s2="abc";System.out.println(s1.hashCode());//96386System.out.println(s1.hashCode());//96386System.out.println(s2.hashCode());//96354System.out.println(s2.hashCode());//96354}
}

5.hashSet集合元素的去重操作(有些情况搞不动)

需求:
创建一个存储学生对象的集合,存储多个学生对象,要求:多个学生对象的成员变量值相同时,我们就认为是同一个对象,要求只保留一个。
分析:
1.定义学生类,创建HashSet集合对象,创建学生对象。
2.把学生添加到集合。
结论:如果希望Set集合认为2个内容一样的对象是重复的,必须重写对象的hashCode()和equals()方法

代码演示

主类代码:

package com.item.demo1hashset;
import java.util.*;
public class SetDemo2 {public static void main(String[] args) {Student s1 = new Student("小王", 18, "北京", "123456");Student s2 = new Student("小李", 19, "北京", "987654");Student s3 = new Student("小王", 18, "北京", "123456");Student s4 = new Student("小李", 189, "北京", "987654");Set<Student> set = new HashSet<Student>();set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);//在没有写equals和hashcode方法时,没有去重!!!,因为这些在java里面每次创建一个新的对象,则地址不一样,存入也不一样。}
}

Student类代码:

package com.item.demo1hashset;import java.util.Objects;public class Student {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;}//这里写入equals和hashCode方法@Overridepublic boolean equals(Object o) {//1.如果自己和自己比返回trueif (this == o) return true;//2.如果o为空或者o不是Student类型返回falseif (o == null || getClass() != o.getClass()) return false;//3.将o转换成Student类型Student student = (Student) o;//4.比较属性是否相同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);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +", phone='" + phone + '\'' +'}'+"\n";}
}

6.LinkedHashSet的底层原理(不常用,所以没有代码演示)

依然是基于哈希表(数组、链表、红黑树)实现的。
但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置。

7.TreeSet的底层原理

基于红黑树实现的排序
注意:
1.对于数值类型:Integer,Double,默认按照数值本身的大小进行升序排序
2.对于字符串类型,默认按照首字符的编号升序排序
3.对于自定义类型如Student对象,TreeSet默认是无法直接排序的。
解决方法:
1.对象类实现一个Comparable比较接口,重写compare方法,指定大小比较规则。
2.public TreeSet(Comparator c)集合自带比较器Comparator对象,指定比较规则。

代码演示

主类代码:

package com.item.demo1hashset;import java.util.*;
public class SetDemo3 {public static void main(String[] args){Set<Teacher> teachers1=new TreeSet<>();teachers1.add(new Teacher("小王", 18,3245.2));teachers1.add(new Teacher("小李", 19,3345.3));teachers1.add(new Teacher("小孙", 20,3609.4));teachers1.add(new Teacher("小张", 18,2780.3));System.out.println(teachers1);//不修改就无法去重//解决方法2:Set<Teacher> teachers=new TreeSet<>(new Comparator<Teacher>() {@Overridepublic int compare(Teacher o1, Teacher o2) {return Double.compare(o2.getSalary(), o1.getSalary());//降序}});//继续简化//Set<Teacher> teachers=new TreeSet<>((o1, o2)->Double.compare(o2.getSalary(), o1.getSalary()));teachers.add(new Teacher("小王", 18,3245.2));teachers.add(new Teacher("小李", 19,3345.3));teachers.add(new Teacher("小孙", 20,3609.4));teachers.add(new Teacher("小张", 18,2780.3));System.out.println(teachers);//解决方法//1,对象类实现一个Comparable比较接口,重写compare方法,指定大小比较规则。//2.public TreeSet(Comparator c)集合自带比较器Comparator对象,指定比较规则。//解决方法2:Set<Teacher> teachers2=new TreeSet<>();teachers2.add(new Teacher("小王", 18,3245.2));teachers2.add(new Teacher("小李", 19,3345.3));teachers2.add(new Teacher("小孙", 20,3609.4));teachers2.add(new Teacher("小张", 18,2780.3));System.out.println(teachers);}
}

Teacher类代码:

package com.item.demo1hashset;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher implements Comparable<Teacher>{private String name;private int age;private double salary;@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}'+"\n";}//解决方法1:重写方法,比较两个对象的大小@Overridepublic int compareTo(Teacher o) {//按照年龄升序return this.getAge()-o.getAge();}
}

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

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

相关文章

【实习总结】C++ 通过pugi::xml库对xml文件进行操作

目录 相关背景 pugi::xml简概 将配置信息写入xml文件 读取xml文件中的配置信息 相关背景 当我们需要将某些配置信息写入项目目录下的xml文件&#xff0c;或者再程序启动时&#xff0c;加载项目下已有的的配置信息&#xff08;.xml&#xff09;&#xff0c;此时&#xff0c;我…

Linux文件回收机制:安全删除文件不怕误删

Linux文件回收机制&#xff1a;安全删除文件不怕误删 文章目录 Linux文件回收机制&#xff1a;安全删除文件不怕误删一、Linux默认没有“回收站”&#xff1f;二、打造你自己的Linux回收站1. 建立回收站目录2. 创建软删除命令remove3. 定时清理回收站4. 替换rm命令5. 完整脚本 …

数据结构排序

目录 1、插入排序 2、希尔排序 3、堆排序 4、直接选择排序 5、快排 6、归并排序 补&#xff1a;计数排序 1、插入排序 void InsertSort(int* arr, int n) {int i 0;for (int i 0; i 1 < n; i){int end i;int tmp arr[end 1];while (end > 0){if (arr[end] &…

Spring声明式事务生效是有条件滴!

在日常工作中&#xff0c;经常使用Transactional 注解进行事务的声明&#xff0c;但如果发现事务未生效&#xff0c;可以从下面几个方面进行排查。 常见失效场景总结 场景原因解决方案内部方法调用绕过了Spring代理注入自身或使用AopContextprivate方法AOP无法增强改为public方…

Code Composer Studio快捷键

文本编辑 编辑、查找、替换功能快捷键 功能快捷键撤销CutZ重做CutY剪切CtrlX复制CtrlC粘贴CtrlV删除Delete全选CtrlA代码块选中AltShiftA查找、替换Ctrl F查找下一个匹配的字符串CtrlK查找上一个匹配的字符串CtrlShiftK查看接口注释&#xff08;文档&#xff09;F2查看函数帮…

从认识AI开始-----生成对抗网络(GAN):通过博弈机制,引导生成

前言 生成对抗网络&#xff08;GAN&#xff09;是lan J. Goodfellow团队在2014年提出的生成架构&#xff0c; 该架构自诞生起&#xff0c;就产生了很多的话题&#xff0c;更是被称为生成对抗网络是“新世纪以来机器学习领域内最有趣的想法”。如今&#xff0c;基于生成对抗网络…

限流算法java实现

参考教程&#xff1a;2小时吃透4种分布式限流算法 1.计数器限流 public class CounterLimiter {// 开始时间private static long startTime System.currentTimeMillis();// 时间间隔&#xff0c;单位为msprivate long interval 1000L;// 限制访问次数private int limitCount…

Maven 构建性能优化深度剖析:原理、策略与实践

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

JS手写代码篇---手写深拷贝

17、深拷贝 深拷贝与浅拷贝最大的不同就是对象的属性是嵌套对象&#xff0c;会新建一个对象 步骤&#xff1a; 判断是否为对象判断是否为i数组或者对象&#xff0c;给新的有个容器遍历循环&#xff0c;如果是对象要遍历循环&#xff0c;采用递归 function deepCopy(obj){// …

【react实战】如何实现监听窗口大小变化

在日常开发场景中&#xff0c;监听窗口变化是一个比较常见又很重要的业务功能&#xff0c;其实实现起来也很简单&#xff0c;今天就来记录一下具体的实现以及注意事项。 实现思路 在 React 中&#xff0c;可以通过监听 window 的 resize 事件来检测可视区域&#xff08;viewp…

AVCap视频处理成帧和音频脚本

###############处理原视频&#xff0c;使其格式和原数据一样 import os import cv2 import subprocess import json from PIL import Image from pydub import AudioSegmentimport sys import shutil # &#x1f539; 第一步&#xff1a;强制检测并设置FFmpeg路径 &#x1f5…

数据冗余对企业运营的隐性成本

从客户管理到供应链优化&#xff0c;再到市场分析&#xff0c;数据无处不在&#xff0c;数据已成为企业运营的核心驱动力。然而&#xff0c;随着企业IT系统的多样化和数据量的激增&#xff0c;数据冗余&#xff08;Data Redundancy&#xff09;问题逐渐浮出水面&#xff0c;成为…

HTML原生日期插件增加周次显示

<div id="app" class="box box-info" style="border-top-color:white;"><!-- // 日期部分 --><div class="date-picker-container" style="position: relative; max-width: 200px;"><!-- 日期输入框 -…

渗透测试PortSwigger Labs:遭遇html编码和转义符的反射型XSS

1 处是我们输入的标签被服务器 html 编码后返回&#xff0c;被浏览器当作字符串显示出来&#xff0c;无法执行 javascript 2 处是唯一能控制的地方&#xff0c;正好在script标签范围内&#xff0c;可以尝试构造 依然存在转移单引号&#xff0c;我们输入转义符\让服务器添加的转…

Ansible 错误处理:确保高效自动化

当 Ansible 收到命令的非零返回码或模块故障时,默认情况下,它会停止在该主机上的执行,并在其他主机上继续执行。但是,在某些情况下,您可能需要不同的行为。有时非零返回码表示成功。有时您希望一台主机上的故障导致所有主机上的执行停止。Ansible 提供了处理这些情况的工具…

【无标题】NP完全问题的拓扑对偶统一解法 ——四色问题到P=NP的普适框架

NP完全问题的拓扑对偶统一解法 ——四色问题到PNP的普适框架 **摘要** 本文提出基于**拓扑膨胀-收缩对偶性**的计算理论框架&#xff0c;突破传统NP完全性理论局限。通过将离散组合问题转化为连续几何问题&#xff0c;并引入规范场量子求解机制&#xff0c;实现四色问题、子…

【Zephyr 系列 19】打造 BLE 模块完整 SDK:AT 命令系统 + 状态机 + NVS + OTA 一体化构建

🧠关键词:Zephyr、BLE 模块、SDK 构建、AT 命令框架、有限状态机、Flash 配置、MCUboot OTA 📌面向读者:希望将 BLE 项目标准化、封装化、支持量产使用的开发团队与架构师 📊预计字数:5500+ 字 🧭 背景与目标 在完成多个 BLE 功能模块后,一个企业级产品往往需要:…

机器学习核心概念速览

机器学习基本概念 有监督学习分类、回归无监督学习聚类、降维 一维数组 import numpy as np data np.array([1,2,3,4,5]) print(data) print(data.shape) print(len(data.shape))[1 2 3 4 5] (5,) 1二维数组 data2 np.array([[1,2,3],[4,5,6]]) print(data2) print(data2…

在 Java 中实现一个标准 Service 接口,并通过配置动态选择具体实现类供 Controller 调用

在 Java 中实现一个标准 Service 接口&#xff0c;并通过配置动态选择具体实现类供 Controller 调用&#xff0c;是解耦和灵活扩展的常见设计模式。 需求分析 当你需要开发一个需要灵活切换业务实现的系统&#xff0c;比如不同环境使用不同策略&#xff08;如测试环境用Mock实…

input+disabled/readonly问题

背景&#xff1a; vue2elementui <el-input v-model"inputForm.projectName" class"input-font" :disabled"projectDisabled" placeholder"请选择" :readonly"isReadonly"><el-button slot"append"…