从零学Java Set集合

Java Set集合

文章目录

  • Java Set集合
    • 1 Set 集合
    • 2 Set实现类
      • 2.1 HashSet【重点】
      • 2.2 LinkedHashSet
      • 2.3 TreeSet
    • 3 Comparator 自定义比较器

1 Set 集合

特点:无序无下标、元素不可重复。

方法:全部继承自Collection中的方法。

常用方法

public class TestSet01 {
    public static void main(String[] args) {
        //创建集合
        Set<String> set = new HashSet<>();
        //1 添加
        set.add("苹果");
        set.add("香蕉");
        set.add("西瓜");
        set.add("菠萝");
        set.add("桃子");
        set.add("榴莲");
        //不能添加重复元素
        //set.add("苹果");
        System.out.println("元素个数: "+set.size());
        System.out.println("打印: "+set);
        //2 删除
        //2.1 删除单个元素
        //set.remove("西瓜");
        //2.2 清空
        //set.clear();
        //3 遍历
        //3.1 增强for
        for (String s : set) {
            System.out.println(s);
        }
        //3.2 迭代器
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        //4 判断
        //4.1 判断是否存在
        System.out.println(set.contains("榴莲"));
        //4.2 判断是否为空
        System.out.println(set.isEmpty());
    }
}

2 Set实现类

2.1 HashSet【重点】

存储结构: 哈希表(数组+链表),基于hashCode、equals实现元素不重复。

在这里插入图片描述

存储过程

  1. 根据元素的hash值计算位置,如果这个位置没有元素直接加入。

  2. 如果有元素会调用equals进行确认,结果为true,拒绝后者存入,如果为false,形成链表。

常用方法:

public class TestHashSet {
    static class Student {
        String name;
        int age;

        public Student() {
        }

        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
        /*
          重写规则:
            1 equals和hashCode要同时重写
            2 两个方法依据的属性保持一致
        */
        @Override
        public 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);
        }

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

    public static void main(String[] args) {
        //创建集合
        HashSet<Student> hashSet = new HashSet<>();
        //创建三个学生对象
        Student s1 = new Student("小明", 18);
        Student s2 = new Student("小红", 28);
        Student s3 = new Student("小白", 21);
        Student s4 = new Student("小白", 21);
        //1 添加
        hashSet.add(s1);
        hashSet.add(s2);
        hashSet.add(s3);
        hashSet.add(s4);
        System.out.println("元素个数: "+hashSet.size());
        System.out.println("打印: "+hashSet);
        //2 删除
        //2.1 删除单个元素
        //hashSet.remove(s3);
        //System.out.println("删除后: "+hashSet);
        //2.2 清空
        //hashSet.clear();
        //3 遍历
        //3.1 增强for
        for (Student student : hashSet) {
            System.out.println(student);
        }
        //3.2 迭代器
        Iterator<Student> it = hashSet.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        //4 判断
        //4.1 判断是否存在某元素
        System.out.println(hashSet.contains(s1));
        //4.2 判断是否为空
        System.out.println(hashSet.isEmpty());
    }
}

2.2 LinkedHashSet

存储结构: 双向链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序。

常用方法: 与上方一致

LinkedHashSet<Student> set = new LinkedHashSet<>();

2.3 TreeSet

存储结构: 红黑树,基于排序实现元素不重复。

  • 对集合元素自动排序。
  • 元素的类型必须实现Comparable接口,或自定义比较器。

二叉查找树:

  1. 一个节点最多只能有两个子节点
  2. 左节点都比根节点小, 右节点都比根节点大, 没有重复的
  3. 遍历:
    • 先序遍历(根左右);
    • 中序遍历(左根右);
    • 后序遍历(左右根);

红黑树: 一种特殊的二叉平衡查找树

  1. 节点有黑色和红色
  2. 左右保证平衡

常用方法:

public class TestTreeSet {
    //静态内部类实现Comparable<?>接口
    static class Student implements Comparable<Student> {
        String name;
        int age;

        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }

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

        @Override
        public int compareTo(Student o) {
            int n1 = this.age-o.age;
            int n2 = this.name.compareTo(o.name);
            return n1==0?n1:n2;
        }
    }

    public static void main(String[] args) {
        //创建集合
        TreeSet<Student> treeSet = new TreeSet<>();
        //创建四个元素
        Student s1 = new Student("小明", 16);
        Student s2 = new Student("小红", 21);
        Student s3 = new Student("aaa", 19);
        Student s4 = new Student("bbb", 19);
        //1 添加
        treeSet.add(s1);
        treeSet.add(s2);
        treeSet.add(s3);
        treeSet.add(s4);
        System.out.println("个数: "+treeSet.size());
        System.out.println("打印: "+treeSet);
        //2 删除
        //treeSet.remove(s4);
        //System.out.println("删除后: "+treeSet);
        //3 遍历
        //3.1 增强for
        for (Student student : treeSet) {
            System.out.println(student);
        }
        //3.2 迭代器
        Iterator<Student> it = treeSet.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        //4 判断
        System.out.println(treeSet.contains(s4));
        System.out.println(treeSet.isEmpty());
    }
}

3 Comparator 自定义比较器

特点:

  • 元素自身提供的比较规则称为自然排序。
  • Comparator可以实现定制比较规则。
  • compare(o1,o2),如果返回值为0,则为重复元素。
  • 使用Comparator比较器,元素类型可不实现Comparable接口,并且优先级高于Comparable接口。
//创建比较器,定制比较规则
Comparator<Student> cmp = new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        int n1 = o1.name.compareTo(o2.name);
        int n2 = o1.age- o2.age;
        return n1==0?n2:n1;
    }
};
//创建集合
TreeSet<Student> treeSet = new TreeSet<>(cmp);

练习:

TreeSet实现字符串按照长度排序,如果长度相同,按照编码顺序。

eg:

public class TestComparator {
    public static void main(String[] args) {
        //练习:TreeSet实现字符串按照长度排序,如果长度相同,按照编码顺序。
        //匿名内部类
        Comparator<String> cmp = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int n1 = o1.length()-o2.length();
                int n2 = o1.compareTo(o2);
                return n1==0?n2:n1;
            }
        };
        TreeSet<String> treeSet = new TreeSet<>(cmp);
        treeSet.add("aaaaa");
        treeSet.add("bbbbb");
        treeSet.add("aaa");
        treeSet.add("badssd");
        treeSet.add("xxxxxxxx");
        treeSet.add("aasbv");
        System.out.println(treeSet);
    }
}

res:

[aaa, aaaaa, aasbv, bbbbb, badssd, xxxxxxxx]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

❤ Vue3 完整项目太白搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript(一)yarn 版本控制 ltb (太白)

❤ 项目搭建 一、项目信息 Vue3 完整项目搭建 Vue3PiniaVant3/ElementPlustyperscript&#xff08;一&#xff09;yarn 版本控制 项目地址&#xff1a; 二、项目搭建 &#xff08;1&#xff09;创建项目 yarn create vite <ProjectName> --template vueyarn install …

最佳实践:如何在 SoapUI 中进行 REST 服务的测试

SoapUI 频繁地被选择为 SOAP 和 REST API 的自动化测试利器&#xff0c;得益于其友好的用户界面&#xff0c;测试人员毫不费力便可校验 REST 和 SOAP 协议的 Web 服务。它尤其适用于那些需要进行复杂测试的场合。 1、设置接口 我利用了 Swagger 去设置了一批即将投入使用的接…

zookeeper下载安装部署

zookeeper是一个为分布式应用提供一致性服务的软件&#xff0c;它是开源的Hadoop项目的一个子项目&#xff0c;并根据google发表的一篇论文来实现的。zookeeper为分布式系统提供了高效且易于使用的协同服务&#xff0c;它可以为分布式应用提供相当多的服务&#xff0c;诸如统一…

青年人格测验

青年人格量表也叫加州人格量表&#xff08;cpi&#xff09;&#xff0c;源于美国心理学家高夫的人格理论&#xff0c;共包含有18个维度&#xff0c;其中每个维度都是人格的基础元素&#xff0c;是人们在成长和外界交往中所形成的。 主要应用在人才测评领域&#xff0c;用来评估…

基于视频智能分析技术的AI烟火检测算法解决方案

一、背景需求 根据国家消防救援局公布的数据显示&#xff0c;2023年共接报处置各类警情213.8万起&#xff0c;督促整改风险隐患397万处。火灾危害巨大&#xff0c;必须引起重视。传统靠人工报警的方法存在人员管理难、场地数量多且分散等问题&#xff0c;无法有效发现险情降低…

Java并发之同步三:Condition条件队列

一、总览 二、源码分析 2.1 人口 public Condition newCondition() {return sync.newCondition();}final ConditionObject newCondition() {return new ConditionObject();}public class ConditionObject implements Condition, java.io.Serializable {private static final lo…

细说DMD芯片信号-DLP3

1&#xff0c; Block diagram 2. 信号介绍 2.1, LS interface&#xff1a; LD_Data_P/N(i), LD_CLK_P/N(i), LS_RDATA_A_BIST(O) 2.2, 视频信号: HSSI(High speed serial interface) High speed Differential Data pair lan A0~7 P/N, High speed Differential Clock A High…

《Vue2 进阶知识》动态挂载组件之Vue.extend + vm.$mount

前言 目前工作还是以 Vue2 为主&#xff0c;今早有人提问 如何动态挂载组件&#xff1f; 话说很久很久以前就实现过&#xff0c;今天再详细的整理一下此问题&#xff01; 开始 动态组件如下&#xff0c;是个简单的例子&#xff1a; 但请注意这里给了个 id"test2"…

CloudCompare——点云空间圆拟合

目录 1.概述2.软件实现3.完整操作4.算法源码5.相关代码 本文由CSDN点云侠原创&#xff0c;CloudCompare——点云空间圆拟合&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT生成的文章。 1.概述 CloudCompare软件中的To…

【Java反射】Java利用反射获取和设置对象某属性的值

通用工具类&#xff1a; package com.zlp.util;import com.fasterxml.jackson.annotation.JsonProperty;import java.lang.reflect.Field;public class ReflectUtil {/*** 反射获取对象的属性值** param object 对象&#xff08;要遍历的对象&#xff09;* param targetFieldN…

QT上位机开发(日志调试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 程序开发中有很多的调试方法&#xff0c;比如说IDE调试&#xff0c;也就是设置断点、查看变量等等&#xff1b;比如说日志调试&#xff1b;比如说c…

Vue2 实现带输入的动态表格,限制el-input输入位数以及输入规则(负数、小数、整数)

Vue2 实现el-input带输入限制的动态表格&#xff0c;限制输入位数以及输入规则&#xff08;负数、小数、整数&#xff09; 在这个 Vue2 项目中&#xff0c;我们实现一个限制输入位数&#xff08;整数16位&#xff0c;小数10位&#xff09;以及输入规则&#xff08;负数、小数、…

Python商业数据挖掘实战——爬取网页并将其转为Markdown

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言前言正则表达式进行转换送书活动 前言 在信息爆炸的时代&#xff0c;互联网上的海量文字信息如同无尽的沙滩。然而&#xff0c;其中真正有价值的信息往往埋…

如何高效编写测试用例

本话题暂不探讨是否有必要编写详细的测试用例&#xff0c;在确定要交付详细的测试用例这个前提下&#xff0c;分享如何更高效地完成测试用例的编写。 对齐测试用例需求 首先、明确要完成的测试用例文档目标要求&#xff0c;模板、范围、粒度等。 用例文档使用者&#xff1a;…

内网穿透NPS搭建以及使用

今天说一下 内网穿透代理&#xff08;NPS&#xff09;搭建以及使用&#xff0c;内网穿透必然有一个外网服务器做代理转发&#xff0c;市面上的NATAPP、花生壳等也都是一个原理。 需求&#xff1a; window 本地开发&#xff0c;外网访问本地服务联合调试 环境&#xff1a; 公网…

HackerGPTWhiteRabbitNeo的使用及体验对比

1. 简介 WhiteRabbitNeo&#xff08;https://www.whiterabbitneo.com/&#xff09;是基于Meta的LLaMA 2模型进行特化的网络安全AI模型。通过专门的数据训练&#xff0c;它在理解和生成网络安全相关内容方面具有深入的专业能力&#xff0c;可广泛应用于教育、专业培训和安全研究…

基于python的室内老人实时摔倒智能监测系统(康复训练检测+代码)

概述 导入所需的库&#xff0c;包括cv2、和numpy。 定义了一个用于计算角度的函数calculate_angle(a, b, c)&#xff0c;其中a、b和c是三个关键点的坐标。 初始化姿态检测和绘图工具。 打开并读取视频文件。 -摔倒检测&#xff08;fallen&#xff09; 循环遍历视频的每一帧…

【计算机组成-计算机基本结构】

课程链接&#xff1a;北京大学陆俊林老师的计算机组成原理课 1. 电子计算机的兴起 原因&#xff1a;二战对计算能力的需求世界上第一台通用电子计算机 ENIAC&#xff08;Electronic Numerical Integrator And Computer&#xff09;&#xff1a;时间&#xff1a;1946&#xff1…

小智ToDo:日程待办清单管理的智能助手

在繁忙的工作与生活中&#xff0c;有效的时间管理和任务规划是提高效率的关键。今天&#xff0c;我们来探讨一款名为“小智ToDo”的日程待办清单管理工具&#xff0c;它以其多端数据同步、备忘提醒、日程管理等实用功能&#xff0c;为用户提供了便捷的时间管理解决方案。 小智T…

单主机双屏幕实现跨屏幕信息交互的GUI程序

单主机双屏幕实现跨屏幕信息交互的GUI程序 运行程序界面 屏幕1发送数据&#xff0c;屏幕2接收数据 在屏幕1按下打开开关&#xff0c;屏幕2播放视频 代码程序 import tkinter as tk # 导入tkinter模块&#xff0c;用于创建GUI界面 import threading # 导入threading模块&#…