Java中的set集合是什么意思

作者:石原里美的微笑 时间:2023-02-02 15:40:31 

引言

在前面的内容中,我们先是一一介绍了Collection集合中都有哪些种类的集合,并且详细地讲解了List集合中的相关知识,那么今天我们来详细地讲解一下Collection集合中的另外一个分支——Set系列集合。最后还是希望这一篇篇的文章能够对你在集合中的学习、Java中的学习起到一定的帮助作用,好了,闲话不多说直接步入正题吧。

概念

Set系类集合特点:

  • 无序:存取顺序不一致

  • 不重复:可以去除重复

  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

Set集合实现类特点:

HashSet:无序、不重复、无索引

LinkedHashSet:有序、不重复、无索引

TreeSet:排序、不重复、无索引

Set集合的功能上基本上与Collection的API一致。

HashSet集合

HashSet集合:

Set<String> set = new HashSet<>();
       set.add("石原里美");
       set.add("石原里美");
       set.add("工藤静香");
       set.add("朱茵");
       System.out.println(set);
       set.remove("朱茵");
       System.out.println(set);

输出结果:

Java中的set集合是什么意思

通过上述代码与运行结果,我们可以清晰地看出,HashSet集合无序、不重复的特性;

Java中的set集合是什么意思

结合上述图片所示,可以看出HashSet集合是无法通过get()方法的索引获取数据的,并且在删除集合中的数据的时候,也只能通过定向的对数据进行删除。

LinkedHashSet集合:

LinkedHashSet集合:

Set<String> set = new LinkedHashSet<>();
       set.add("石原里美");
       set.add("石原里美");
       set.add("工藤静香");
       set.add("朱茵");
       System.out.println(set);
       set.remove("朱茵");
       System.out.println(set);

输出结果:

Java中的set集合是什么意思

通过上述代码与输出结果做对比,即可看出无序与有序之间的区别,前者是会将传入的数据顺序打乱,而后者则是仍然按照输入数据的顺序存储数据,因此输出的时候是有序状态。

TreeSet集合:

TreeSet集合:

Set<Integer> set = new TreeSet<>();
       set.add(13);
       set.add(23);
       set.add(23);
       set.add(11);
       System.out.println(set);
       set.remove(23);
       System.out.println(set);

输出结果:

Java中的set集合是什么意思

通过上述代码和输出结果我们便可以通过字面意思去理解为什么TreeSet的特点是排序了,即将存储的数据按照Java默认的排序方式进行排序。

然而此时若存储自定义如People对象,TreeSet无法直接排序,会出现报错的情况!

Java中的set集合是什么意思

//People类:
public class People{
   private String name;
   private int age;
   private String classroom;
   public People(){
   }
   public People(String name, int age, String classroom) {
       this.name = name;
       this.age = age;
       this.classroom = classroom;
   }
   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;
   }
   public String getClassroom() {
       return classroom;
   }
   public void setClassroom(String classroom) {
       this.classroom = classroom;
   }
   @Override
   public String toString() {
       return "People{" +
               "name='" + name + '\'' +
               ", age=" + age +
               ", classroom='" + classroom + '\'' +
               '}';
   }
}
//main方法:
public static void main(String[] args) {
       Set<People> p = new TreeSet<>();
       p.add(new People("张三",19,"智能"));
       p.add(new People("李四",18,"数据库"));
       p.add(new People("王五",20,"渗透"));
       System.out.println(p);
   }

若想解决该问题,我们就需要为TreeSet集合自定义存储类型,现有两种方式可以解决该问题:一种是自定义类实现Comparable接口并重写里面的compareTo方法指定规则;另一种则是集合自带比较器对象进行规则定义。

方式一:自定义类实现Comparable接口重写里面的compareTo方法指定比较规则(多余无关紧要的代码在此不再赘述了,只展示重要的那部分代码)

//改变的第一个地方:实现Comparable类
public class People implements Comparable<People> {
//改变的第二个地方:重写Comparable类中的compareTo方法    
   @Override
   public int compareTo(People o) {
       return this.age-o.age;
   }
}

输出结果(根据年龄进行比较):

Java中的set集合是什么意思

在重写的方法中,return后面的代码决定了该对象将要根据什么准则进行比较,比较规则如下:

  • 如果认为第一个元素大于第二个元素返回正整数即可

  • 如果认为第一个元素小于第二个元素返回负整数即可

  • 如果认为第一个元素等于第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复

方式二:集合自带比较器对象进行规则定义

Set<People> p = new TreeSet<>(new Comparator<People>() {
           @Override
           public int compare(People o1, People o2) {
               return o1.getAge()-o2.getAge();
           }
       });

在原来的基础之上对集合的创建作出改变,并且其比较准则与前面的定义方法类似,相对前面的方式,这种方式会更加方便快捷一些。在此,我们也可以回顾一些前面所学到的知识&ldquo;Lambda表达式&rdquo;,对给代码块进行化简。

Set<People> p = new TreeSet<>((o1, o2) -> o1.getAge()-o2.getAge());

如果没有学习过Lambda表达式,或者说是对Lambda表达式的知识不清晰,那么可以可以看Java中的lambda表达式如何理解&mdash;&mdash;精简这篇文章的讲解,或许会对你有所帮助的。

Java中的set集合是什么意思

实战场景

  • 元素可以重复、又有索引、索引查询速度快

使用ArrayList集合,基于数组

  • 元素可以重复、又有索引、增删首尾操作快

使用LinkedList集合,基于链表

  • 增删查改快,但是元素不重复、无序、无索引

使用HashSet集合,基于哈希表

  • 增删查改快,但是元素不重复、有序、无索引

使用LinkedHashSet集合,基于哈希表和双链表

  • 需要对对象进行排序

使用TreeSet集合,基于红黑树,后续也可以使用List集合实现

来源:https://blog.csdn.net/weixin_50635856/article/details/124806587

标签:java,set,集合
0
投稿

猜你喜欢

  • JAVA注解代码详解一篇就够了

    2022-12-27 14:45:26
  • Unity查找游戏物体的六种方式详解

    2021-07-09 18:23:17
  • 使用AOP拦截Controller获取@PathVariable注解传入的参数

    2023-04-30 21:42:09
  • Android使用多线程进行网络聊天室通信

    2022-05-11 18:56:36
  • C#中ValueTuple的原理详解

    2023-10-26 06:40:34
  • Java+Ajax实现的用户名重复检验功能实例详解

    2022-12-01 12:54:46
  • Java Class 加密工具 ClassFinal详解

    2023-02-10 14:58:48
  • Android之使用Android-query框架开发实战(二)

    2022-06-30 16:17:59
  • 浅谈java安全编码指南之死锁dead lock

    2023-06-22 04:49:19
  • unity shader实现玻璃折射效果

    2022-04-16 08:22:36
  • c# 委托和事件实例学习

    2023-07-04 06:25:58
  • Android异常处理最佳实践

    2021-06-15 20:17:12
  • 浅谈Java中复制数组的方式

    2022-04-14 23:30:27
  • SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法

    2023-11-01 16:03:39
  • unity实现贴图矩阵运算(旋转平移缩放)

    2022-07-27 13:53:41
  • Android超详细讲解组件LinearLayout的使用

    2023-11-01 01:04:27
  • c#中Linq to Sql 增删除的实例

    2022-08-24 02:15:34
  • Android开发人脸识别登录功能

    2022-03-02 14:16:12
  • C# 获取程序集版本、文件版本

    2022-12-14 13:47:31
  • mybatis like模糊查询特殊字符报错转义处理方式

    2023-09-02 21:14:54
  • asp之家 软件编程 m.aspxhome.com