java的集合中的Set以及set的实现类HashSet和TreeSet

Java集合之Set Set集合及其实现类简介 阅读详情

Set接口
Set是Collection的子接口,与List相对
Set集合中的元素的特点是1,无序性 2,无下标3,无重复的元素
Set是个接口,所以无法直接创建对象,要依赖它的实现类来创建对象
Set的实现类有两个,一个是HashSet,另一个是TreeSet

    Set<String> set = new HashSet<>();
    set.add("c");
    set.add("b");
    set.add("d");
    set.add("a");
    set.add("a");
    System.out.println(set);

输出的结果是

[a, b, c, d]//根据输出结果,我们可以看出set 的无序性和无重复性

Set的成员方法基本上都是继承了collection方法
下面我们看一下Set的实现类

HashSet
HashSet是set的实现类,底层是由哈希算法实现的
因为HashSet中能会添加相同的对象,所以HashSet常常被用来去除集合中重复的元素

    HashSet<String> hashSet = new HashSet<>();
    hashSet.add("a");
    hashSet.add("b");
    hashSet.add("d");
    hashSet.add("d");
    System.out.println(hashSet);

输出结果是:

[a, b, d]

根据输出的结果可以看出HashSet确实去除了重复的对象,那么add的底层实现具体是什么?
因为HashSet是由哈希算法来实现的,在一个对象要被添加到集合中的时候,会被系统分配一个哈希值,系统首先会根据这个对象的哈希值去和集合中的对象去比较,如果哈希值不同就可以加入,如果不同,就去比较俩字符串的值是否一样,如果一样就不能加入,因此把重复的对象是无法加入HashSet的

当我们加入的对象是数据类型不是系统的数据类型,我们来看一下HashSet如何去除重复的
先写一个StudentL类,student有俩变量,一个是名字.一个是年龄

public class Student 
{
  private String name;
  private int age;
public Student(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}
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 "Student [name=" + name + ", age=" + age + "]";
} 
}

下面我们在HashSet集合中添加三个Student类的对象

  HashSet<Student> hashSet = new HashSet<>();
   hashSet.add(new Student("张三", 18));
   hashSet.add(new Student("李四", age));
   hashSet.add(new Student("张三", 18));
   System.out.println(hashSet);

输出的结果是:

[Student [name=张三, age=18], Student [name=张三, age=18], Student [name=李四, age=19]]

可以看出,俩张三都被添加进去了,但是重复的我们并不想添加进去,为什么会被添加进去呢
这时因为在创建student的时候,我们给每个对象都在堆内存中开辟了一片空间,虽然俩对象中的元素相等,但是他们的地址是不一样的,所以系统认为他们是不同的,所以被添加进去了
如果我们要让系统把student中重复的去掉,我们只能从底层去操作,因为HashSet是系统内部根据比较Hash值来判断的,然后在调用equals方法来比较的,所以我们要重写Object类中的hashCode和equals方法
因为我们要对Student类的对象排序,自然是Student类的对象来调用,所以在Student类中进行方法的重写

 //重写hashCode方法
 @Override
    public int hashCode() 
//这里返回的是要添加的对象的哈希值
    {
        return 1;
    }
//重写equals方法
 @Override
    public boolean equals(Object obj) 
 {
     Student student = (Student)obj;
     if (student.name.equals(this.name)&&student.age == this.age)
     {
        return true;
     }
        return false;
    }
}

我们再次运行,输出的结果是:

[Student [name=张三, age=18], Student [name=李四, age=19]]

这次可以看出重复的对象已经被去除了.

TreeSet
TreeSet是Set的一个实现类,底层是由二叉树实现的
下面我们创建一个TreeSet类型的集合,并将几个整数装进去

TreeSet<Integer> treeSet = new TreeSet<>();
    treeSet.add(10);
    treeSet.add(8);
    treeSet.add(15);
    treeSet.add(11);
    treeSet.add(8);
    System.out.println(treeSet);

输出的结果是

[8, 10, 11, 15]//我们可以根据输出的结果看出TreeSet会将对象排序并将重复的删除了

HashSet的作用就是去除重复的对象,而TreeSet的主要作用就是排序
下面我们在TreeSet中添加非系统类的对象
例:在TreeSet中添加四个学生类对象

       TreeSet<Student> treeSet = new TreeSet<>();
       treeSet.add(new Student("张三", 18));
       treeSet.add(new Student("李四", 19));
       treeSet.add(new Student("张三", 18));
       System.out.println(treeSet); 

当我们运行的时候,会发现系统会报错,这是因为我们添加进去的Student类,不是系统类,系统不知道怎么排序,所以会报错
我们写系统类之所以系统会排序,是因为系统类中都实现了Comparable接口中的比较的抽象方法,系统在add的时候,要添加的系统对象会调用这个比较方法,进行排序和去除重复的对象
所以我们需要在Student类中实现接口,重写接口中的比较方法

//重写comparable接口中的抽象方法,主要是把对象的排序的规则写进去
@Override
//要注意的是当返回值为0的时候,系统就会认为俩值是一样的,就不会添加该对象
    public int compareTo(Student o) {
        // TODO Auto-generated method stub
    int ageNum = this.age - o.age;
    int nameNum = this.name.compareTo(o.name);
    //当年龄一样的时候,我们就比较俩者的姓名
    return ageNum == 0 ? nameNum :ageNum;
    }

运行得到的结果是:

[Student [name=张三, age=18], Student [name=李四, age=19]]

可以看出我们的运行结果已经根据年龄排序了,但是这种方法有一个局限,如果该类的对象被装到俩集合中,排序的条件不同,这样的话就没法重写抽象方法了.

这时候我们可以创建每一个集合创建一个比较器,用比较器来排序
我们这里要用到接口Comparator中的比较方法,我们需要给Comparator接口写一个实现类,在类中重写抽象方法 compare(),方法中也是用来写排序的规则的

public class StudentImpl implements Comparator<Student> {
 @Override
public int compare(Student o1,Student o2) 
 {
   int intNum = o1.getAge() - o2.getAge();
   int nameNum = o1.getName().compareTo(o2.getName());
   return nameNum == 0 ? intNum :nameNum;
}
}

在实现了comparator接口后,我们根据其实现类来为TreeSet创建一个比较器

    TreeSet<Student> treeSet = new TreeSet<>(new StudentImpl());
       treeSet.add(new Student("张三", 18));
       treeSet.add(new Student("李四", 19));
       treeSet.add(new Student("张三", 18));
       System.out.println(treeSet);

这样输出的结果是:

[Student [name=张三, age=18], Student [name=李四, age=19]]

这样即使student类被装到很多个集合中,并且排序的条件不同,我们也可以为每一个集合创建一个特有的比较器来比较

踩过20+工控视觉项目的坑后,我用C# + 海康相机 + YOLOv11实现了零依赖产线缺陷检测 触发式检测:只有光电传感器检测到零件到位,才触发相机拍照和算法检测,不是持续推理,减少工控机性能占用;全链路本地运行:从图像采集、算法推理到不良品剔除,所有逻辑全在本地工控机运行,不需要外网、不需要云端服务,哪怕产线断网也能正常运行;异常降级机制:算法推理异常时,系统自动触发产线缓停,同时声光告警,不会让不良品流到下工序,满足汽车行业IATF16949质量要求;模块化解耦:算法核心层和业务逻辑层完全分离,后续更换YOLO模型、新增缺陷类型,只需要替换模型文件,不需要修改业务逻辑;全链路可追溯。 阅读详情

相关推荐

InternVL 3.5 深度解析:开源多模态模型的新里程碑

InternVL 3.5是由上海人工智能实验室OpenGVLab团队推出的开源多模态大模型,在推理能力、效率和灵活性方面取得突破。该模型采用ViT-MLP-LLM架构,包含60亿参数的InternViT-6B视觉编码器和多种规格的语言模型骨干。核心创新包括:1)Cascade RL强化学习框架,通过离线热身和在线强化两阶段训练提升推理能力;2)ViR视觉分辨率路由器,动态调整图像处理分辨率以优化计算效率;3)DvD动态视觉token压缩技术。模型系列涵盖2B到241B参数规模,满足从边缘设备到高性能计算的不

m0_47999117的博客 1030

JAVA_Set系列集合:HashSet、LinkedHashSet、TreeSet底层详解

创建TreeSet对象时候,传递比较器Comparator指定规则练习:要按照字符串长度来比较,用自然排序无法比较,所以要使用自定义步骤//创建集合@Override//o1:表示当前要添加的元素//o2表示已经在红黑树存在的元素//按照长度排序//如果一样长则按照首字母排序//调用默认的字符排序,就不会被丢弃return i;});//添加//打印:上面的匿名内部类可以用 Lambda 简化练习题 :TreeSet对象自定义排序。

2301_79947226的博客 1669

饥荒Mod 开发(二):Mod目录结构

饥荒中的每个Mod 都有一些固定的目录结构,各个目录的放着不同类型的文件。动画,图片,源代码等。我们最好是遵守Mod 开发中的各个目录结构,我用的是WeGame 安装的饥荒游戏,Mod 目录如下,这个目录下保存所有订阅的Mod。

小乖写代码 4629

Java集合类中Set类以及HashSet和TreeSet

目录 HashSet TreeSet 集合框架中的Set类:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。 HashSet 特点: 底层数据结构是哈希表。是线程不安全的。不同步。 HashSet是如何保证元素唯一性的呢? 是通过...

Rock N' Roll Forever 332

华为ITR流程实战指南:从设计到落地的全流程解析(附完整方案下载)

本文深度解析华为ITR流程从设计到落地的全流程实战指南。ITR不仅是高效处理客户问题的“救火”系统,更是驱动产品改进、预防问题的企业“免疫系统”。文章详细拆解了流程设计的四步走策略、三层技术支持体系的组织保障、以闭环改进为核心的考核激励,并探讨了如何借鉴其精髓,优化自身问题管理,实现从被动响应到主动服务的跨越。

y2z3a4b5c的博客 378

基于MATLAB开发AUTOSAR软件应用层模块-part3.自动生成的代码文件介绍

上篇文章我们介绍了如何设计一个简单的模型,之后自动生成autosar架构的代码,这篇文章我带大家看下,生成了哪些文件,以及这些文件的内容。 生成的文件见下图: model files是模型控制逻辑部分代码,包括 DEMO1.c DEMO1.h DEMO1_private.h DEMO1_types.h DEMO1.c 1 /* 2 * File: DEMO1.c 3 * 4 * Cod.

汽车软件开发 1977

Java Set类的常见实现类 TreeSet和HashSet

Set集合的常用实现类 TreeSet和HashSet HashSet HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。 HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。 特点: 不能保证元素的排列顺序 HashSet 不是线程安全的 集合元素可以是 null HashSet 集合判断两个元素相等的标准: 两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方

程序员小章的博客 910

33、AI赋能5G/6G通信:LDPC码解码与强化学习技术解析

本文探讨了基于AI和强化学习的LDPC码技术在5G/6G通信中的应用。包括LAMS解码器、神经MS解码器、盲识别方法、统一极性-LDPC解码器、NNMS和SNNMS解码器、N-2D-NMS解码器、神经分层MS解码器、MAB-NS方案以及强化学习与MCTS结合的技术。这些技术在提升解码性能、降低计算复杂度和增强系统适应性方面表现出色,为未来通信系统的发展提供了强有力的支持。

lambda的博客 242

Java集合-Set接口-HashSet和TreeSet实现类

Java集合 -> Set接口 -> HashSet和TreeSet 1. Set接口特性 Set接口继承自Collection,Set 接口中没有新增方法,方法和Collection保持一致; Set特点:无序、不可重复。无序指的是Set中的元素没有索引,因此只能通过遍历查找。 Set的常用实现类:HashSet、TreeSet等。 import java.util.Arrays; import java.util.Collection; import java.util.HashSet;

baidu_38126306的博客 369

【CASS精品教程】013:CASS9.1生成标准图幅案例教程

在CASS中,可以很方便的生成标准图幅,如50*50。本文演示cass中,根据测区范围标准图幅生成过程。

智慧空间实验室 1万+

Carla运行显示The following component(s) are required to run this program:DirectX Runtime |nvapi64.dll没有被

Carla运行显示The following component(s) are required to run this p 参考: 【1】EPIC 启动游戏提示The following component(s) are required to run this program:... - 『悬赏问答区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cnhttps://www.52pojie.cn/thread-1485651-1-1.html ...

anananajiushiwo的博客 5万+

java 输出treeset_Java中的TreeSet的last()方法 Java.util.TreeSet.last() - Break易站

Java中的TreeSetJava.util.TreeSet.last()方法用于返回TreeSet的最后一个元素。这里的最后一个元素被引用到集合中最高的元素。如果元素是整数类型,则返回最大的整数。如果元素是字符串类型,则按字母顺序检查元素,并返回以字典顺序的最后一个字母开头的字符串,而不管长度如何。句法:Tree_Set.last()参数:该方法不接受任何参数。返回值:该方法返回集合的最高成员。...

weixin_39875941的博客 366

C#实现将DataGridView中数据导出到Excel (附完整源码)

C#实现将DataGridView中数据导出到Excel (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1589

java集合02:Collection集合,Set子集合,HashSet实现类和TreeSet实现类

java集合02:Collection集合,Set子集合,HashSet实现类和TreeSet实现类

m0_52051155的博客 245

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java集合(HashSet的子类LinkedHashSet和Set的实现类TreeSet)

一、LinkedHas类特性 LinkedHashSet类与HashSet不同的是,它保证了有序。 程序代码: package com.linkedhashset; import java.util.LinkedHashSet; public class LinkedHashSetDemo{ public static void main(String[] args) { /...

liu_xin_xin的博客 276

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java中的集合2(泛型、Set接口及其实现类HashSet和TreeSet最详解)

文章目录泛型引入概述泛型的使用Set接口实现类:HashSet类概述HashSet的常用方法HashSet的使用实现类:TreeSet概述TreeSet的特点Set接口集合迭代foreach循环遍历迭代器 泛型 引入 为什么需要泛型? ​ 我们知道Object类型可以接收任意类型的对象类型,但在实际使用的过程中,我们总是会遇到有类型转换的问题,这样就会存在一些隐患(比如说当我们需要解决向下转型的问题时,会出现类型不匹配的情况),所以java提供了泛型来解决这个问题。 概述 ​ 泛型,即 " 参数化类型

Lotus_dong的博客 1141

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet

文章目录Set接口概述HashSet实现类LinkedHashSet实现类TreeSet实现类 Set接口概述 1、Set接口是Collection的子接口,set接口没有定义额外的方法,使用的都是Collection接口中的方法。 2、Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。 3、Set:存储无序的、不可重复的数据 (以HashSet为例说明) ①无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值。

叶绿体不忘呼吸 576

JavaSE入门学习36:Java集合框架之Set接口及其实现类HashSet和TreeSet

一Set接口       Set接口可以与数学中的集合的概念相对应。Set接口是Collection接口的子接口,Set接口里多个对象之间没有明 显的顺序。具体详细方法请参考API文档(可见身边随时带上API文档有多重要),基本与Collection接口中定义的方法相 同。只是行为不同(Set不允许包含重复元素)。       Set集合不允许重复元素,是因为Set判断两个对象相同不是使用

life is wonderful 1905

Java集合(四)Set的常用实现类

Set、HashSet(无序Set)、LinkedHashSet(有序Set)、TreeSet(排序Set)

HK的博客 5894

Java中set系列集合

由于Set是Collection的接口(接口无法被实例化),继承于Collection,所以Set接口中的方法基本上与Collection的相同。3.无索引:不可以使用for循环遍历,无法通过索引获取元素,可以通过foreach和Ierator接口遍历。中的所有元素(set集合中只能通过对象删除,set中没有索引)2.重复性:不可重复,可以用于去重操作。返回在该集合的元素上进行迭代的迭代器(判断该集合中是否包含指定集合。中的所有元素添加到该集合中。),用于遍历该集合所有元素。删除该集合中包含指定集合。

songsj010的博客 1495

set集合(HashSet、LinkedHashSet、TreeSet)

计算元素的哈希值,用于快速定位元素在底层数据结构(如哈希表)中的存储位置。两个相同的元素必须返回相同的哈希值。相同),但额外通过链表记录元素顺序,本质是一个 "Linked HashMap" 的 key 集合。:用于精确比较两个元素是否为 "逻辑上的相同元素"。当两个元素的哈希值相同时,会通过。),否则可能出现逻辑矛盾(如元素被视为不同但排序位置相同)。自定义对象去重的关键:对于自定义类的对象,需。,value 是一个固定的空对象(实例):存储的元素被作为。实例):存储的元素被作为。

weixin_62316729的博客 1344

Java—— 集合 Set

Set集合的特点。Set集合的方法。Set集合的实现类的特点。哈希表。哈希值。自定义对象的哈希值特点。HashSet底层原理。底层原理解释HashSet的特点。LinkedHashSet底层原理。底层原理解释LinkedHashSet的特点。TreeSet底层原理。TreeSet默认排序规则。TreeSet自定义排序规则的两种方式:默认排序/自然排序,比较器排序。各种单列集合的使用场景。

zjy_ccccc的博客 901

Java数据结构与算法之数据结构-逻辑结构-集合(七)------集合之Set接口和HashSet和TreeSet、LinkedHashSet实现类总结

一、Set接口的概述: 1、Set接口的基本使用特点: Set接口存储一组唯一,无序的对象 HashSet 是Set接口常用的实现类 HashSet允许集合元素值为null 操作数据的方法与List类似 Set接口不存在get()方法 set 是一个不包含重复元素的集合(collction)。Set接口中的函数都是从Collection继承而来。 但限制了add

复制乔布斯 789

Set接口 及其 实现类 (HashSet, TreeSet)

Set接口 及其两个主要实现类 (HashSet 和 TreeSet) 介绍~

2301_80313139的博客 1400

Java Set接口及其常用实现类详解

是一个有序的集合,它的作用是提供一个有序的Set对象,它内部是基于红黑树实现的。接口的一个常用实现类,它基于哈希表(实际上是一个HashMap实例)实现。接口在Java集合框架中占据着重要地位,它的实现类提供了多种处理不重复元素集合的方式。每种实现类都有其独特的用途和性能特点,理解它们之间的差异有助于编写更加高效和健壮的代码。这些方法对于处理集合非常有用,可以在各种场景中使用它们来查询集合的状态或修改集合的内容。接口提供了一种存储不重复元素集合的方式,并且有多种实现类可供选择,以满足不同的需求。

yokeyhui的博客 1287
上一篇: java中集合中的泛型以及集合中的排序,集合的嵌套
下一篇: java学习之Map接口以及实现类HashMap,TreeMap的使用
HKDXiaoFan
博客等级 码龄9年 8粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值