【set】集合总结

news2024/11/23 20:27:54

一、Set

Set集合是Collection的子接口,代表一种集合,此种集合是元素不重复.

有两个常用实现类

  • HashSet 是元素不重复,无序,主要是指遍历顺序和插入顺序不一致

  • TreeSet 是元素不重复,排序

  • LinkedHashSet不常用

二、HashSet

1.1 介绍

  • HashSet是Set的实现类

  • 底层是由哈希表实现,其实实际是HashMap实现

  • 允许重复,,无序,主要是指遍历顺序和插入顺序不一致

  • 不保证线程安全,即不同步

  • 方法与父接口Set,Collection中基本一致,就是最基本的集合方法,没有关于下标操作

1.2 演示API

练习常用方法

  • 构造方法

  • 添加,删除,清空,大小,迭代,toArray


掌握: 基本方法使用,演示出去重,遍历顺序问题!!!

public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(11);
        set.add(22);
        set.add(33);
        set.add(44);
        set.add(55);
        System.out.println(set.contains(11));   //判断是否包含某个元素
        System.out.println(set.isEmpty());      //判断是否为空
        set.remove(11);                      //移除某个元素
        System.out.println(set.size());         //返回set的大小
        Iterator<Integer> iterator = set.iterator();    //使用迭代器迭代set中的元素
        while (iterator.hasNext()){
            System.out.print(iterator.next()+" ");
        }
        for (Integer i : set) {                 //使用foreach遍历set中的元素,语法糖,等同与迭代器
            System.out.print(i+" ");
        }
    }

1.3 底层原理

  • HashSet底层是哈希表

  • 更直接的是HashSet底层是HashMap

    • 创建HashSet时,其实创建了HashMap

      image-20240605143913477

    • 向set集合add添加元素,其实放在HashMap集合中

      image-20240605144018121

HashSet去重的原理?

  • 向set中存储运算时,调用元素本身的hashCode方法,获得地址值

  • 如果这个地址值在set集合中如果没有相同,就将该元素存储到集合

  • 如果这个地址值在set集合中有相同的,此时调用元素的equals来做判断

    • 如果equals判断为true,属性全部相同,则不存储该元素,即去重

    • 如果equals判断false,属性值有不相同,则存储该元素


简单说就是:

  • 存储的元素地址值不一样,直接存储

  • 地址值一样,再比较equals

    • eqauls判断不等,直接存储

    • equals判断相等,不存

三、LinkedHashSet

        排序且去重

public static void main(String[] args) {
            LinkedHashSet<Integer> lhs = new LinkedHashSet<>();
            lhs.add(3);
            lhs.add(3);
            lhs.add(1);
            lhs.add(5);
            lhs.add(5);
            lhs.add(4);
            lhs.add(2);
            System.out.println(lhs);        //[3, 1, 5, 4, 2]
    }

四、TreeSet

4.1 介绍

  • TreeSet是Set集合的实现类,也是元素不重复

  • 底层是基于TreeMap实现的,TreeMap底层是基于红黑树(是一种特殊的二叉树)

  • 会对存储的元素进行排序,默认按照自然顺序排序;或者是通过根据构造方法传入的比较器进行排序

4.2 方法api

仅介绍特殊方法

public static void main(String[] args) {
    TreeSet<Integer> set = new TreeSet<>( );
​
    // 去重,且默认是自然顺序排序
    set.add(31);
    set.add(13);
    set.add(15);
    set.add(41);
    set.add(11);
    set.add(21);
    System.out.println(set );
    Integer ceiling = set.ceiling(15);    //返回set中大于等于给定的最小元素
    System.out.println("ceiling = " + ceiling );
​
    Integer higher = set.higher(15);      //返回set中严格大于给定元素的最小元素
    System.out.println("higher = " + higher);
}

4.3 排序+去重原理

通过向TreeSet<Studnet>中添加Student对象,发现会报错, 提示无法将Student转换成Comparable接口

  • 从而发现,之前Integer,String等类能排序是因为它们实现Comparable接口,并且重写comparTo的方法

  • 发现这个方法返回值决定了顺序和去重

    • 当前(this)比指定小(o), 将其(this)放左树杈, 即返回负数,将数据放在左边

    • 当前(this)比指定大(o), 将其(this)放右树杈,即返回正数,将数据放在右边

    • 当前(this)等于指定(o), 0 不放,即返回0,不往树上放,则去除

package com.qf.set;
public class Student implements Comparable<Student>{
    private int age;
    private String name;
    
    // set get 构造 toString 省略...
    @Override
    public int compareTo(Student o) {
        int n;
        if (this.age == o.getAge() && this.name.equals(o.getName())){
            n = 0;                            //返回0则去重
        } else if (this.age >= o.getAge()){
            n = 1;                            //返回正数放节点右边
        } else {
            n = -1;                           //返回负数放节点左边
        }
        return  n;
    }
}

4.4 比较器排序

new TreeSet() 空参的,默认是使用原始的自然排序,

new TreeSet(Comparator c), 构造方法传入比较器,就会根据比较器排序

// 自定义比较器类,完成对整数倒序排序

public class MyIntegerComparator implements Comparator<Integer> {
    /**
     * o1 就是当前正在存储的
     * o2 就是之前存储的
     */
    @Override
    public int compare(Integer o1, Integer o2) {
        System.out.println("o1 = " + o1);
        System.out.println("o2 = " + o2);
        return o2 - o1;
    }
}
// 测试

public class Demo9 {
​
    public static void main(String[] args) {
​
        // 演示1: 创建自定义比较器类对象
        //TreeSet<Integer> set = new TreeSet<>(new MyIntegerComparator());
       
        // 演示2: 改写成匿名内部类写法
        // TreeSet<Integer> set =
        //         new TreeSet<>(new Comparator<Integer>( ) {
        //             @Override
        //             public int compare(Integer o1, Integer o2) {
        //                 return o2 - o1;
        //             }
        //         });
​
                new TreeSet<>((o1,o2) -> o2 - o1);
        set.add(3);
        set.add(2);
        set.add(5);
        set.add(1);
        set.add(4);
​
        System.out.println(set );
    }
}

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

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

相关文章

Python数据分析I

目录 注&#xff1a;简单起见&#xff0c;下文中"df"均写为"表名"&#xff0c;"函数"均写为"HS"&#xff0c;"属性"均写为"SX"&#xff0c;"范围"均写为"FW"。 1.数据分析常用开源库 注释…

物联网-高性能时序数据库QuestDB

高性能时序数据库QuestDB 开源地址&#xff1a;https://github.com/questdb/questdb 官网&#xff1a;https://questdb.io/ 当前 13.9k start 自带免费可视化管理界面 支持各种语言客户端 C & C .NET Go Java Node.js Python Rust 上手容易可兼容 Postgresql InfluxDB …

浅浅写一个Word、PowerPoint、Excel文档转PDF工具

前言 最近在搞知识库&#xff0c;需要把各种 Word、PowerPoint、Excel 文件转换成 PDF 文件&#xff0c;不然 Word 中的表格中的文字提取会出现一些问题&#xff1b;使用 Office 或者 WPS 将大量文件转换成 PDF 需要频繁重复打开文件&#xff0c;点击保存为PDF&#xff0c;然后…

Qt_C++ RFID网络读卡器Socket Udp通讯示例源码

本示例使用的设备&#xff1a; WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QHostInfo> #include <QNetworkInterface> #include <…

【机器学习】训练GNN图神经网络模型进行节点分类

1. 引言 1.1 图神经网络GNN概述 图神经网络&#xff08;Graph Neural Network&#xff0c;GNN&#xff09;是一种专门用于处理图结构数据的神经网络方法。它起源于2005年&#xff0c;当时Gori等人首次提出了GNN的概念&#xff0c;用于学习图中的节点特征以及它们之间的关系。…

Doris 少数SQL在Datagrip无法执行,而在DorisUI或程序调用可以执行的问题

问题&#xff1a;Doris 少数SQL在Datagrip无法执行&#xff0c;而在DorisUI或程序调用可以执行 解决&#xff1a;Datagrip 执行SQL切分异常&#xff0c;设置默认执行语句方式&#xff0c;将分句改为整句执行 但是 支持多SQL批量分开执行更好用

英伟达的数字孪生地球是什么

1 英伟达的数字孪生地球 Earth-2是一个全栈式开放平台&#xff0c;包含&#xff1a;ICON 和 IFS 等数值模型的物理模拟&#xff1b;多种机器学习模型&#xff0c;例如 FourCastNet、GraphCast 和通过 NVIDIA Modulus 实现的深度学习天气预测 (DLWP)&#xff1b;以及通过 NVIDI…

大学电工基础与电子设计试题及答案,分享几个实用搜题和学习工具 #其他#经验分享

学习和考试是大学生生活中不可避免的一部分&#xff0c;而在这个信息爆炸的时代&#xff0c;如何快速有效地获取学习资源和解答问题成为了大学生们共同面临的难题。为了解决这个问题&#xff0c;搜题和学习软件应运而生。今天&#xff0c;我将为大家介绍几款备受大学生青睐的搜…

Vue进阶之Vue无代码可视化项目(一)

Vue无代码可视化项目 项目搭建初始步骤拓展:工程项目从0-1项目规范化package.jsoncpell.jsoncustom-words.txtts-eslint规则.eslintrc.cjsgit钩子检查有没有问题type-checkspellchecklint:stylehusky操作安装pre-commitpnpm的commit规范package.json:commitlint.config.cjs安装…

深度解析Linux内核中fork工作原理和实现

Linux内核中的fork()系统调用是用来创建新进程的核心机制。它的主要工作是为新创建的子进程复制当前进程(父进程)的数据结构和内存空间,从而产生一个几乎完全相同的副本。fork()的实现涉及到操作系统内核中许多重要部分的交互和协作,过程比较复杂。 fork()的基本原理 当一个进…

ThinkPHP发邮件配置教程?群发功能安全吗?

ThinkPHP发邮件的注意事项&#xff1f;如何优化邮件发送的性能&#xff1f; 无论是用户注册、密码重置还是消息提醒&#xff0c;发送邮件都是一个常见的需求。AokSend将详细介绍如何在ThinkPHP框架中配置和发送邮件&#xff0c;帮助开发者轻松实现邮件功能。 ThinkPHP发邮件&…

【全开源】同城招聘SAAS信息前程无忧直聘达小程序

招聘SAAS&#xff1a;数字化转型中的招聘新助力 基于ThinkPHP和原生微信小程序开发的招聘平台系统&#xff0c;包含微信小程序求职者端、微信小程序企业招聘端、PC企业招聘端、PC管理平台端​ &#x1f31f; 一、招聘SAAS简介 在人力资源领域&#xff0c;数字化转型已成为不…

铁塔、烟囱建筑倾斜监测的倾角仪的分类以及工作原理

前言 倾角传感器是一种用于测量物体相对平面倾斜角度的仪器。倾角传感器又称作倾角仪、倾斜仪、测斜仪、水平仪、倾角计&#xff0c;经常用于物体的水平角度变化的精确测量&#xff0c;用它可测量被测平面相对于水平位置的倾斜度、两部件相互平行度和垂直度&#xff1b;已成为桥…

南京代理记账公司,为您提供专业服务,助力企业发展

在当今社会&#xff0c;企业的经营情况需要通过各种方式来进行监督和管理&#xff0c;记账是企业日常运营中不可或缺的一部分&#xff0c;对于非专业的财务人员来说&#xff0c;如何进行正确、有效的记账呢&#xff1f;这就需要找一家专业的代理记账公司来帮助您。 南京代理记账…

工程力学 - 课程导论

工程力学是工程学科中的核心基础课程&#xff0c;专注于研究物体在外力作用下的运动规律和受力情况。它涵盖了静力学、运动学、动力学和材料力学等关键领域&#xff0c;为工程结构的安全性、稳定性和功能性提供理论支撑。通过理论分析、实验测定和计算机模拟等方法&#xff0c;…

Hikyuu教程:简单波动率(EMV)择时交易系统的构建与实现

今日&#xff0c;我们将探讨如何借助 hikyuu 框架实现简单波动指标 EMV 的择时系统。与以往稍有不同的是&#xff0c;本次我们将采用策略部件仓库的写法来完成示例代码&#xff0c;以便大家进一步了解和熟悉仓库的使用方法。 什么是简易波动指标&#xff08;EMV&#xff09; …

[ubuntu]docker 卡登录 You‘ve been signed out

Setting->Resources->Proxies设置当前使用的proxies即可 参考&#xff1a;https://github.com/docker/for-mac/issues/7160#issuecomment-2061040813

香蕉派BPI-F3 进迭时空(SpacemiT)K1RISC-V开发板软件下载链接

香蕉派BPI-F3是一款工业级 8核RISC-V开源硬件开发板&#xff0c;它采用进迭时空&#xff08;SpacemiT&#xff09; K1 8核RISC-V芯片设计&#xff0c;CPU集成2.0 TOPs AI计算能力。4G DDR和16G eMMC。2个GbE以太网接口&#xff0c;4个USB 3.0和PCIe M.2接口&#xff0c;支持HDM…

Sylar C++高性能服务器学习记录21 【ByteArray模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频。 由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去。 每每想起倍感惋惜&#xff0c;遂提笔再续前缘。 为了能更好的看懂sylar&…

HTML静态网页成品作业(HTML+CSS)—— 金宝贝儿童教育机构介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…