【set】集合总结

一、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 );
    }
}

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

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

相关文章

区块链(Blockchain)调查研究(一)

文章目录 1. 区块链是什么&#xff1f;2. 区块链分类和特点3. 区块链核心关键技术3.1 共识机制3.2 密码学技术3.4 分布式存储3.5 智能合约 4. 区块链未来发展趋势5. 区块链能做什么、不能做什么&#xff1f;5.1 第一部分5.2 第二部分5.3 第三部分&#xff08;结论&#xff09; …

④-1单细胞学习-cellchat单数据代码补充版

目录 1&#xff0c;数据输入及处理 ①载入包和数据 ②CellChat输入数据准备 ③构建CellChat对象 ④数据预处理 2&#xff0c;细胞通讯预测 ①计算细胞通讯概率 ②提取配受体对细胞通讯结果表 ③提取信号通路水平的细胞通讯表 ④细胞互作关系可视化 1&#xff09;细胞…

java线程相关知识点

Java多线程涉及以下几个关键点 1.线程生命周期&#xff1a;理解线程从创建到销毁的各个阶段&#xff0c;包括新建、运行、阻塞、等待、计时等待和终止。 2.线程同步&#xff1a;掌握如何使用synchronized关键字和Lock接口来同步代码&#xff0c;防止数据竞争和死锁。 3.线程间通…

csrf与xss差别 别在弄乱了 直接靶场实操pikachu的csrf题 token绕过可以吗???

我们现在来说说这2个之间的关系&#xff0c;因为昨天的我也没有弄清楚这2者的关系&#xff0c;总感觉迷迷糊糊的。 xss这个漏洞是大家并不怎么陌生&#xff0c;导致xss漏洞的产生是服务器没有对用户提交数据过滤不严格&#xff0c;导致浏览器把用户输入的当作js代码返回客户端…

HCIA--NAT地址转换(复习)

先交换后路由&#xff1a; 1&#xff1a;在交换机上创建vlan&#xff0c;进入接口划分vlan&#xff0c;接着在交换机连接路由器的接口上建立trunk干道 2&#xff1a;在路由器上&#xff0c;先配置物理接口IP&#xff0c;接着在路由器上创建两个子接口&#xff0c;将建立的vla…

Fences 5 激活码 - 电脑桌面整理软件

提起桌面整理&#xff0c;经典老牌工具 Fences 必有一席之地&#xff0c;Stardock 发布了最新的 Fences 5 版本。 可以将文件和图标归类放入各个栅栏分区&#xff0c;并支持文件夹展开至桌面、分区置顶、淡化隐藏图标等功能&#xff0c;能让你的桌面焕然一新&#xff0c;不再混…

请求 响应

在web的前后端分离开发过程中&#xff0c;前端发送请求给后端&#xff0c;后端接收请求&#xff0c;响应数据给前端 请求 前端发送数据进行请求 简单参数 原始方式 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest 对象手动获取。 代码…

数据库四种隔离等级

持续更新以及完善中… 数据库事务隔离 首先&#xff0c;为什么要有事务隔离呢&#xff1f; 在单线程下&#xff0c;没什么大碍&#xff0c;但是我们想要提高效率&#xff0c;采用多线程并发时&#xff0c;便会出现一些问题。 **下面的问题一定要当作一个事务来看待&#xf…

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

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

电影制作中的版本控制:Perforce Helix Core帮助某电影短片避免灾难性文件损坏,简化艺术资产管理

Zubaida Nila是来自马来西亚的一名视觉特效师和虚拟制作研究员&#xff0c;她参加了Epic Games的一个为期六周的虚拟培训和指导项目——女性创作者计划。该计划提供了虚幻引擎工作流程的实践经验以及其他课程。Zubaida希望从中获得更多关于虚幻引擎的灯光、后期处理和特效技能方…

279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计

基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计。计算出满足功率因素、电压不平衡度等电能指标的条件下。RPC所需要的补偿功率。求得所需最小的系统客量。该设计能快速计算出符合系统设定指标的各项最优补偿功率。并通过sumulink份真。检验设计参数的准确性。…

Pytorch 实现目标检测二(Pytorch 24)

一 实例操作目标检测 下面通过一个具体的例子来说明锚框标签。我们已经为加载图像中的狗和猫定义了真实边界框&#xff0c;其中第一个 元素是类别&#xff08;0代表狗&#xff0c;1代表猫&#xff09;&#xff0c;其余四个元素是左上角和右下角的(x, y)轴坐标&#xff08;范围…

极域卸载不干净导致无法重新安装问题:独家解决方案

文章目录 一、问题二、解决1.网上常规方法2.本贴特殊之处 三、致谢 一、问题 极域卸载不干净&#xff0c;导致无法重新安装。 二、解决 1.网上常规方法 1.regedit命令注册表删除 topdomain、mythware、{5FB4EEDF-6A79-45C3-B049-EF327CA03FCD} 2.删除极域对应tmp文件 网上…

稀疏高效扩散模型:推动扩散模型的部署与应用

数据驱动的世界中&#xff0c;生成模型扮演着至关重要的角色&#xff0c;尤其是在需要创建逼真样本的任务中。扩散模型&#xff08;Diffusion Models, DM&#xff09;&#xff0c;以其卓越的样本质量和广泛的模式覆盖能力&#xff0c;已经成为众多数据生成任务的首选。然而&…

ToonCrafter - AI 生成动画越来越简单了,两张照片生成动画视频 本地一键整合包

动画制作对很多人来说应该都是一项非常专业且复杂的工作&#xff0c;需要学习专门的知识&#xff0c;掌握特定的工具&#xff0c;并且投入大量的时间精力才能得到成果&#xff0c;不过最近出现的一款 AI 动画制作工具 ToonCrafter 则有希望改变这一现状。它只需 2 张图像就生成…

Spring之SpringMVC源码

SpringMVC源码 一、SpringMVC的基本结构 1.MVC简介 以前的纯Servlet的处理方式&#xff1a; Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String type req.getParameter(Constant.REQUEST_PA…

策略模式的理解和运用

在之前的小游戏项目中&#xff0c;处理websocket长连接请求的时候&#xff0c;需要根据传递数据包的不同类型&#xff0c;进行不同的处理。为了实现这个场景&#xff0c;比较简单的方法就是使用if-else或者switch-case语句&#xff0c;根据条件进行判断。但是这导致了项目代码复…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

日进2000,我怎么做到的

昨天遇到一个有意思的项目&#xff0c;让我一天进账2000&#xff0c;一个字&#xff1a;爽。 这几天接洽了一位新客户&#xff0c;主要诉求就是优化系统&#xff0c;基于LNMP的系统优化。正好这个领域我比较熟悉&#xff0c;以前都是在公司做项目&#xff0c;也不怎么涉猎系统优…

展会邀请 | 龙智即将亮相2024上海国际嵌入式展,带来安全合规、单一可信数据源、可追溯、高效协同的嵌入式开发解决方案

2024年6月12日至14日&#xff0c;备受全球嵌入式系统产业和社群瞩目的2024上海国际嵌入式展&#xff08;embedded world china 2024&#xff09;即将盛大开幕&#xff0c;龙智将携行业领先的嵌入式开发解决方案亮相 640展位 。 此次参展&#xff0c;龙智将全面展示专为嵌入式行…