从零学Java Set集合

news2024/11/17 15:38:00

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]

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

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

相关文章

windos exe 以服务的形式运行(开机运行)

windos 品台编写的 小工具 exe 或者 批处理 .bat 经常需要开机自启动&#xff0c;可以直接把它 加在开启启动项&#xff0c;或者做成 windos服务&#xff0c;这样既可以开机自动启动而且还可以 防止误触关闭掉&#xff1b; windos 以服务启动 exe/bat 的通用方式&#xff1…

js逆向第18例:猿人学第15题备周则意怠-常见则不疑

文章目录 一、前言二、定位关键参数三、代码实现四、参考文献一、前言 任务十五:抓取这5页的数字,计算加和并提交结果 二、定位关键参数 先找到数据接口 可以看到接口的url地址中存在变量m如下 进入堆栈,定位m值 如下图逻辑很清晰,可以看到window.

ChatGPT到底能做什么呢?

1、熟练掌握ChatGPT提示词技巧及各种应用方法&#xff0c;并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告&#xff0c;提供写作能力及优化工作 3、熟练掌握ChatGPT融合相关插件的应用&#xff0c;完成数据分析、编程以及深度学习等相关科研项目。 4、…

【AI视野·今日Sound 声学论文速览 第四十三期】Mon, 8 Jan 2024

AI视野今日CS.Sound 声学论文速览 Mon, 8 Jan 2024 Totally 6 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers MusicAOG: an Energy-Based Model for Learning and Sampling a Hierarchical Representation of Symbolic Music Authors Yikai Qian, Tia…

实现秒杀功能设计

页面 登录页面 登录成功后&#xff0c;跳转商品列表 商品列表页 加载商品信息 商品详情页 根据商品id查出商品信息返回VO&#xff08;包括rmiaoshaStatus、emainSeconds&#xff09;前端根据数据展示秒杀按钮&#xff0c;点击开始秒杀 订单详情页 秒杀页面设置 后端返回秒杀…

在线陪玩软件开发系统(APP小程序H5、平台、搭建)游戏陪玩系统APP开发 源码搭建,源码交付,支持二开!

一、游戏陪玩系统APP的核心功能 1. 匹配系统&#xff1a;通过智能匹配算法&#xff0c;将寻找陪玩的玩家与愿意提供陪玩服务的玩家进行匹配&#xff0c;确保双方的需求能够得到满足。 2. 实时通讯&#xff1a;提供实时语音和文字聊天功能&#xff0c;让玩家和陪玩者可以在游戏…

Js - 函数(四)

1.函数简单介绍 什么是函数&#xff1f; 函数&#xff08;function&#xff09;是执行特定任务的一段代码块 为什么需要函数&#xff1f; 可以实现代码复用&#xff0c;提高开发效率 2.函数使用 函数的声明语法 函数名命名规范 函数的调用语法 函数体 函数体是函数的构…

【Scala】——流程控制

1 if-else 分支控制 让程序有选择的的执行&#xff0c;分支控制有三种&#xff1a;单分支、双分支、多分支 1.1单分支 if (条件表达式) {执行代码块 }1.2 双分支 if (条件表达式) {执行代码块 1 } else {执行代码块 2 }1.3 多分支 if (条件表达式1) {执行代码块 1 } else …

选中图层为什么不能建立3D模型---模大狮模型网

在Photoshop CC 2021(也就是PS6)中&#xff0c;要将选中的图层转换为3D模型&#xff0c;需要满足以下几个条件&#xff1a; 图层类型支持&#xff1a;只有特定类型的图层可以被转换为3D模型。通常&#xff0c;普通的像素图层、矢量图层和形状图层都可以进行转换。但是&#xff…

仲晶同志简历

女&#xff0c;汉族。1972年出生&#xff0c;国防大学科技与装备教研室教官。1992年&#xff0c;仲晶毕业于军事气象学院&#xff0c;1996年成为国防大学国防科技发展战略学硕士研究生&#xff0c;毕业后留校任教。曾出版过9部军事专著&#xff0c;先后发表学术论文100多万字。…

VUE element-ui实现表格动态展示、动态删减列、动态排序、动态搜索条件配置、表单组件化。

1、实现效果 1.1、文件目录 1.2、说明 1、本组件支持列表的表头自定义配置&#xff0c;checkbox实现 2、本组件支持列表列排序&#xff0c;vuedraggable是拖拽插件&#xff0c;上图中字段管理里的拖拽效果 &#xff0c;需要的话请自行npm install 3、本组件支持查询条件动态…

代码随想录算法训练营第三十一天|理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

题目&#xff1a;理论基础 解释&#xff1a;贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优 题目&#xff1a;455.分发饼干 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:455.分发饼干 题目链接&#xff1a;力扣题目链接 图释&#x…

【REST2SQL】07 GO 操作 Mysql 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 MySQL是一个关系型数据库管理系统&#xf…

低代码与小程序开发:简化创新,加速应用开发

随着信息技术的迅速发展&#xff0c;应用程序的需求与日俱增。然而&#xff0c;传统的软件开发往往耗时、复杂&#xff0c;对于许多企业和开发者来说&#xff0c;开发应用程序的成本和难度成为了一道门槛。而近年来&#xff0c;低代码开发和小程序开发的兴起为解决这一难题带来…

专搞大厂?免费开源?这个小工具我相信很多人需要!

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; XHS-Downloader v1.6是一款功能齐全的免费开源工具&#xff0c;它使用Python Requests库开发而成&#xff0c;用于采集和下载X红S作品。该工具具备多…

青年人格测验

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

「 网络安全术语解读 」点击劫持Clickjacking详解

引言&#xff1a;要想深入理解点击劫持攻击&#xff0c;我们需要先清楚iframe的用途及优缺点。 1. 关于iframe iframe是HTML语言中的一部分&#xff0c;通常用于在网页中嵌入其他网页的内容&#xff0c;如图像、视频、音频、链接等。它允许在一个网页中插入另一个网页&#xf…

《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗

《豫鄂烽火燎原大小焕岭》&#xff1a;一部穿越时空的历史史诗 一部赓续红色血脉的生动教材 一部讴歌时代英雄和人民精神宝典 当历史的烽烟渐渐远去&#xff0c;留下的是一页页泛黄的记忆和无数英雄的壮丽诗篇。李传铭的力作《豫鄂烽火燎原大小焕岭》正是这样一部深情的回望&am…

实现线程同步的几种方式

线程同步 1. 线程同步概念 线程同步是指多个线程协调它们的执行顺序&#xff0c;以确保它们正确、安全地访问共享资源。在并发编程中&#xff0c;当多个线程同时访问共享数据或资源时&#xff0c;可能会导致竞争条件&#xff08;Race Condition&#xff09;和其他并发问题 所…

【深度学习 | 风格迁移】神经网络风格迁移,原理详解附详细案例源码

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…