Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)

news2024/12/27 12:07:16

Set集合

package SetDemo;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetDemo {
    public static void main(String[] args) {
       /*
       Set集合的特点:
       1.Set系列集合的特点:
            Set集合是一个存储元素不能重复的集合方式,因为存储数据的时候通过判断其元素的hashCode值,不一样再存储。
       2.Set集合的实现类特点:
            HashSet: 无序,不重复,无索引
            LinkedHashSet:有序,不重复,无索引
            TreeSet:可排序,不重复,无索引
       3.Set集合的方法与Collection一致
       需求:
           利用Set系列的集合,添加字符串,并使用多种方式遍历。
            迭代器
            增强for
            Lambda表达式
        */
        // 1.创建set集合的对象
        Set<String> set = new HashSet<>();
        // 2.为set对象添加元素
        boolean b1 = set.add("a");
        boolean b2 = set.add("a");
        set.add("c");
        set.add("b");
        set.add("e");
        set.add("d");
        System.out.println(b1);// true
        System.out.println(b2);// false
        // 3.循环输出集合中的元素
        Iterator<String> iter = set.iterator();
        // 迭代器
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }
        // 增强for
        for (String s : set) {
            System.out.println(s);
        }
        // lambda表达式
        set.forEach(System.out::println);
    }
}

HashSet

package SetDemo;

import java.util.HashSet;

public class HashSetDemo {
    public static void main(String[] args) {
    /*
        HashSet用于给数据去重,不需要保证数据的添加顺序时用(无序,不重复,无索引)
        Hash值:
            1.是根据hashCode方法算出来的int类型的整数
            2.该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
            3.一般情况下,重写hashCode方法,利用对象内部的属性值计算哈希值
        对象的哈希值特点:
             1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
             2. 如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
             3. 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)
             4. String 和 Integer不需要重写hashCode方法,Java已经重写了,自定义对象要重写hashCode
            需求:创建一个存储学生对象的集合,存储多个学生对象。
            使用程序实现在控制台遍历该集合。
            要求:学生对象的成员变量值相同,我们就认为是同一个对象

     */
        //创建学生对象
        Student stu1 = new Student("张三",18);
        Student stu2 = new Student("张三",18);
        Student stu3 = new Student("李四",18);
        Student stu4 = new Student("王五",19);
        // 创建HashSet集合
        HashSet<Student> set = new HashSet<>();
        // 1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
        System.out.println(stu1.hashCode());//189568618
        System.out.println(stu2.hashCode());//793589513
        // 将学生对象存入集合( 要重写hashCode,否则就会有重复属性值的元素,因为添加元素是按照hash值来判断的 )
        set.add(stu1);
        set.add(stu2);
        set.add(stu3);
        set.add(stu4);
        // 输出集合
        System.out.println(set);//[name王五, age=19, name张三, age=18, name李四, age=18]
        // 3.在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。
        //哈希碰撞
        System.out.println("abc".hashCode());//96354
        System.out.println("acD".hashCode());//96354
    }

}

LinkedHashSet

package SetDemo;

import java.util.LinkedHashSet;

public class LinkedHashSetDemo {
    public static void main(String[] args) {
     /*
           LinkedHashSet :用于给数据去重且要保证数据的添加顺序时用。(有序,不重复,无索引)
           有序:指的是输出的顺序和添加元素时的顺序一致
      */
        //1.创建4个学生对象
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("lisi",24);
        Student s3 = new Student("wangwu",25);
        Student s4 = new Student("zhangsan",23);


        //2.创建集合的对象
        LinkedHashSet<Student> lhs = new LinkedHashSet<>();


        //3.添加元素
        System.out.println(lhs.add(s3));
        System.out.println(lhs.add(s2));
        System.out.println(lhs.add(s1));
        System.out.println(lhs.add(s4));

        //4.打印集合
        System.out.println(lhs);//[namewangwu, age=25, namelisi, age=24, namezhangsan, age=23]
    }
}

TreeSet

package SetDemo;

import java.util.TreeSet;

public class TreeSetDemo{
    public static void main(String[] args) {
        /*
            TreeSet:用于数据唯一且需要按指定的要求排序时使用 (不重复,无索引,可排序)
            可排序:按照元素的默认规则(由小到大)排序,字符类型按照ASCII码表的数字升序排列的
            TreeSet基于红黑树的数据结构实现排序,增删改查性能都比较好
         */
        /*
            需求:
                1.存储整数并进行排序
                2.使用自定义类型,按元素的规则排序
                排序方法:
                    给Student类实现Comparable接口,重写里面的抽象方法
         */
        TreeSet<Integer> ts  = new TreeSet();
        // 1.存储整数并进行排序
        ts.add(3);
        ts.add(2);
        ts.add(7);
        ts.add(6);
        ts.forEach(System.out::println);// 2 3 6 7
        // 2.使用自定义类型,按元素的规则排序
        TreeSet<Student> tss = new TreeSet();
        Student stu1 = new Student("二",13);
        Student stu2 = new Student("一",11);
        Student stu3 = new Student("五",12);
        Student stu4 = new Student("三",10);
        tss.add(stu1);
        tss.add(stu2);
        tss.add(stu3);
        tss.add(stu4);
        System.out.println(tss);//[name三, age=10, name一, age=11, name五, age=12, name二, age=13]
    }
}

 Student类

package SetDemo;

import java.util.Objects;

public class Student implements Comparable<Student> {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student() {}

    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;
    }

    @Override
    public String toString() {
        return "name" + name + ", age=" + age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student that = (Student) o;
        return age == that.age && Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    // TreeSet排序规则
    public int compareTo(Student o) {
        // 指定排序的规则
        // 按年龄进行排序;
        // this表示当前要添加的元素,o表示已经存在于红黑树中的元素
        System.out.println("this:"+this);
        System.out.println("o:"+o);
        return this.getAge()-o.getAge();
    }
}

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

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

相关文章

【数据结构(邓俊辉)学习笔记】图03——拓扑排序

文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事&#xff0c;如编讲义&#xff0c;将已经知道的知识点串起来变成讲课序列。那…

AIGC作答《2024年高考作文|新课标I卷》能拿多少分?

AIGC作答《2024年高考作文&#xff5c;新课标I卷》能拿多少分&#xff1f; 一、前言二、题目三、作答 一、前言 如火如荼的2024年高考圆满落幕&#xff0c;在如此Happy的时刻&#xff0c;AIGC技术正以其前所未有的热度席卷全球。它不仅改变了我们获取信息的方式&#xff0c;也…

RJ45 PCB布线

RJ45底盘接地和数字地通过一个1M欧姆的电阻和一个0.1uF的去耦电容隔离。其底盘接地和数字地的间距&#xff0c;必须比60mil宽。如图11及图12所示。 图11 典型变压器集成单RJ45的机箱/数字地平面 图12 典型RJ45和变压器分开的机箱/数字地平面https://www.bilibili.com/read/…

Java学习-JDBC(二)

核心API 注册驱动 Class.forName(“com.mysql.cj.jdbc.Driver”);在Java中&#xff0c;当使用JDBC连接数据库时&#xff0c;需要加载数据库特定的驱动程序&#xff0c;以便与数据库进行通信&#xff0c;加载驱动程序的目的是为了注册驱动程序&#xff0c;使得JDBC API能够识别…

Element-UI入门

目录 1.什么是Element-UI 2.作用 3.版本历史 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.代码示例 7.未来展望 8.总结 1.什么是Element-UI Element-UI 是由饿了么前端团队开发的一套基于 Vue.js 的桌面端组件库。提供了一整套 UI 组件&#xff0c;使开发者能够快速构…

统信UOS1070上配置文件管理器默认属性01

原文链接&#xff1a;统信UOS 1070上配置文件管理器默认属性01 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在统信UOS 1070上配置文件管理器默认属性的文章。文件管理器是我们日常操作系统使用中非常重要的工具&#xff0c;了解如何配置其默认属性可以极大地…

使用贝塞尔曲线实现一个iOS时间轴

UI效果 实现的思路 就是通过贝塞尔曲线画出时间轴的圆环的路径&#xff0c;然后 使用CAShaper来渲染UI&#xff0c;再通过 animation.beginTime [cilrclLayer convertTime:CACurrentMediaTime() fromLayer:nil] circleTimeOffset 来设置每个圆环的动画开始时间&#xff0c; …

手写kNN算法的实现-用余弦相似度来度量距离

设a为预测点&#xff0c;b为其中一个样本点&#xff0c;在向量空间里&#xff0c;它们的形成的夹角为θ&#xff0c;那么θ越小&#xff08;cosθ的值越接近1&#xff09;&#xff0c;就说明a点越接近b点。所以我们可以通过考察余弦相似度来预测a点的类型。 from collections i…

【学术小白成长之路】03三方演化博弈(基于复制动态方程)均衡点与稳定性分析

从本专栏开始&#xff0c;笔者正式研究演化博弈分析&#xff0c;其中涉及到双方演化博弈分析&#xff0c;三方演化博弈分析&#xff0c;复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献&#xff0c;总结了现有的研究常用的研究流程&#xff0c;针对每个流程进行拆解。…

HTML-CSS练习例子

HTML CSS 练习 https://icodethis.com 作为前端练习生。不敲代码只看&#xff0c;入门是很慢的&#xff0c;所以直接实战是学习前端最快的途径之一。 这个网站练习HTML CSS的&#xff0c;可以打开了解一下&#xff0c;可以每天打卡&#xff0c;例子简单&#xff0c;循序渐进&…

《TCP/IP网络编程》(第十三章)多种I/O函数(2)

使用readv和writev函数可以提高数据通信的效率&#xff0c;它们的功能可以概括为**“对数据进行整合传输及发送”**。 即使用writev函数可以将分散在多个缓冲中的数据一并发送&#xff0c;使用readv函数可以由多个缓冲分别接受&#xff0c;所以适当使用他们可以减少I/O函数的调…

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知 道它们的类别&#xff0c;还想得到它们在图像中的具体位置。在…

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言&#xff1a;在开发过程中&#xff0c;几乎踩便了所有大坑小坑总结出的文章&#xff0c;我是把坑踩满了&#xff0c;帮助更过小白快速上手&#xff0c;如有错误之处&#xff0c;还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能&#xff1a; 模组启动模…

vscode 突然无法启动 WSL terminal 了怎么办?

参考&#xff1a;https://github.com/microsoft/vscode/issues/107485 根据参考网页&#xff0c;似乎在 windows 更新之后&#xff0c;重启&#xff0c;就有可能出现标题所说的 vscode 无法启动 WSL terminal 的情况。 首先使用 cmd 进入 wsl 终端&#xff0c;把 ~/.vscode-se…

EON安装ASE Interface

EON安装 我的eon路径于/eon/。 则环境为 export PYTHONPATH/eon/:$PYTHONPATH export PATH/eon/bin:$PATHsource: https://theory.cm.utexas.edu/eon/installation.html ASE 测试系统ubuntu。如果你python2和python3总是纠缠不清&#xff0c;可以sudo apt install python-…

vscode中执行python语句dir(torch)不返回结果

输入半天&#xff0c;发现在IDLE运行后的shell界面输入语句就会返回一大串。但是在vscode中老是不返回值。 结果恍然发现这没加print&#xff08;&#xff09;。 无语惨了。 家人们&#xff0c;这是python&#xff0c;而不是matlab。思维还没转换过来&#xff0c;笑死

扩散模型Stable Diffusion

扩散模型构成 Text Encoder(CLIPText) Clip Text为文本编码器。以77 token为输入&#xff0c;输出为77 token 嵌入向量&#xff0c;每个向量有768维度。 Diffusion(UNetScheduler) 在潜在空间中逐步处理扩散信息。以文本嵌入向量和由噪声组成的起始多维数组为输入&#xff0c…

二叉树—leetcode

前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇&#xff1a;数据结构-二叉树-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &…

Zynq7000 系列FPGA模块化仪器

• 基于 XilinxXC7Z020 / 010 / 007S • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 FPGA 控制器 Zynq7000 系列模块是基于 Xilinx XC7Z020/010/007S 全可编程片上系统 (SoC) 的…

LLM的基础模型8:深入注意力机制

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…