首页 > 编程语言 >java中的set集合

java中的set集合

时间:2024-04-20 14:55:44浏览次数:16  
标签:set java HashSet add 123 集合 public TreeSet

java中的set集合

目录

1.HashSet集合

1.1HashSet的特点

  1. HashSet底层实现使用的是HashMap
  2. 不能保证元素的顺序,元素是无序的,不能有重复元素
  3. 集合元素允许是null
  4. HashSet线程不安全

1.2HashSet常用方法

  1. add(Object o):向Set集合中添加元素,不允许添加重复数据。
  2. size():返回Set集合中的元素个数
public class Test1 {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(123);
        set.add(123);
        set.add(234);
        System.out.println("set = " + set);
        System.out.println(set.size());
    }
}

注意:不会按照保存的顺序存储数据(顺序不定),遍历时不能保证下次结果和上次相同。且向HashSet集合中添加元素,HashSet add方法实质是map全局变量调用了put方法,将数据存到了key,因为HashMap的 key不允许重复,所以HashSet添加的元素也不允许重复。

  1. remove(Object o): 删除Set集合中的obj对象,删除成功返回true,否则返回false。
  2. isEmpty():如果Set不包含元素,则返回 true。
public class Test1 {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(123);
        set.add(123);
        set.add(234);
        System.out.println(set.isEmpty());
        System.out.println(set.remove(Integer.valueOf(123)));
        System.out.println(set);
    }
}
  1. clear(): 移除set中的所有元素
public class Test1 {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(123);
        set.add(123);
        set.add(234);
        System.out.println(set);
        set.clear();
        System.out.println(set);
    }
}
  1. iterator():返回在此Set中的元素上进行迭代的迭代器。
public class Test1 {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(123);
        set.add(123);
        set.add(234);
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
  1. contains(Object o):判断集合中是否包含obj元素。
public class Test1 {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(123);
        set.add(123);
        set.add(234);
        System.out.println(set.contains(123));
    }
}
  1. 加强for循环遍历Set集合:
public class Test1 {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(123);
        set.add(123);
        set.add(234);
        for (Integer integer : set) {
            System.out.println(integer);
        }
    }
}

注意:因此set中的元素是没有顺序的,所有不能用下标来获取元素

2.LinkedHashSet集合

2.1LinkedHashSet集合的特点

  1. LinkedHashSet底层使用的是HashSet,同时使用链表维护元素的插入顺序
  2. 元素有序且唯一,链表保证了元素有序
  3. 哈希表保证了元素唯一
  4. 线程不安全

3.TreeSet集合

3.1TreeSet集合的特点

  1. TreeSet其内部使用的是TreeMap,TreeMap是基于红黑树实现的
  2. 插入数据内部有两种排序方法:自然排序(默认)、定制排序
  3. 无序:TreeSet会对插入的数据排序,所以输入的顺序和输出的顺序不一致
  4. 值不能为null
  5. 值唯一
  6. 线程不安全

3.2TreeSet的基本使用

  1. 插入是按字典序排序的
public class Test1 {
    public static void main(String[] args) {
        TreeSet<Integer> ts = new TreeSet<>();
        ts.add(234);
        ts.add(123);
        ts.add(99);
        System.out.println(ts);
    }
}
  1. 如果插入的是自定义对象 需要让类实现 Comparable 接口并且必须要重写compareTo
import java.util.TreeSet;

public class Person implements Comparable {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }


    @Override
    public int compareTo(Object o) {
        Person p = (Person) o;
        if (this.name.compareTo(p.name) != 0) {
            return this.name.compareTo(p.name);
        } else {
            if (this.age > p.age) return 1;
            else if (this.age < p.age) return -1;
        }
        return 0;
    }
}

class Test {
    public static void main(String[] args) {
        TreeSet<Person> ts = new TreeSet<>();
        ts.add(new Person("abc", 18));
        ts.add(new Person("adf", 28));
        ts.add(new Person("abac", 20));
        ts.add(new Person("adf", 15));
        for (Person t : ts) {
            System.out.println(t.name+" "+t.age);
        }
    }
}

输出

abac 20
abc 18
adf 15
adf 28

4.HashSet、LinkedHashSet、TreeSet的使用场景

HashSet:HashSet的性能基本上比LinkedHashSet和TreeSet要好,特别是添加和查询,这也是用的最多的两个操作

LinkedHashSet:LinkedHashSet的查询稍微慢一些,但是他可以维持元素的基本顺序。所以只有要求当插入顺序和取出顺序一致的时候,才会使用LinkedHashSet

TreeSet:只有需要对元素进行排序的时候使用

5.list和set集合的区别

5.1有序性

  • List保证了按插入顺序排序
  • Set存储和取出的顺序不一致

5.2唯一性

  • List可以重复
  • Set元素唯一

5.3获取元素

  • List可以通过索引直接操作元素
  • Set不能根据索引获取元素

总结

Set集合不能重复,常规使用HashSet,在需要添加顺序和取出顺序一致的时候使用LinkedHashSet,当需要排序时使用TreeSet

标签:set,java,HashSet,add,123,集合,public,TreeSet
From: https://www.cnblogs.com/ning23/p/18147691

相关文章

  • java中的接口
    java中的接口目录java中的接口特征接口回调接口和抽象类的异同总结特征接口使用interface关键字接口中的所有方法默认都是publicabstract修饰接口中所有的成员变量都是publicstaticfinal修饰接口没有构造方法,构造方法用于创建对象(接口没办法new对象),但是接口使用......
  • Java 集合进阶使用(List Map Set)
    CollectionCollection是其子集的父类,所以可以使用多态的规矩,比如:创建一个ArrayList对象,用Collection接收Collection<Integer>collection=newArrayList<>();注意:Collection为接口,不能直接创建对象,但可以利用其子类,使用Collection方法,就如上方代码一样Collection......
  • 【转载】Java函数式编程——为什么new Thread()中要用函数式编程
    面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。面向对象的思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情.函数式编程思想:只要能获取到结果,谁去做的,怎么做的都不重要,......
  • Python与Java数据结构语法区别
    数组参考链接:CS61BPythonzeroedLst=[0,0,0]lst=[4,7,10]lst[0]=5print(lst[0])print(lst)print(len(lst))Javaint[]zeroedArray=newint[3];int[]array={4,7,10};array[0]=5;System.out.println(array[0]);System.out.println(Ar......
  • java srpint boot 2.2.1 第二部份,锁机制和分页查询 以及统一返回结果格式,
    第二部份,引起锁机制的原理和解决方案: 测试环境搭建第一步先建一个数据库表用于模拟商品购买。CREATETABLEproduct(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255)NOTNULL,stockINTNOTNULL,versionINTNOTNULLDEFAULT0);第二步......
  • Google和Oracle关于Java的知识产权诉讼
    Google和Oracle关于Java的知识产权诉讼背景Oracle收购SUN之后立即对Oracle展开了诉讼.经历了多级法院的上诉和驳回.2021.4.5美国联邦最高法院判断.Google不侵权.无需赔偿Oracle提起的80亿美金的诉讼但是专利官司在美国科技史上影响很大.AMD跟Intel的关于x86......
  • [Java]volatile关键字
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18031966出自【进步*于辰的博客】启发博文:《Javavolatile关键字最全总结:原理剖析与实例讲解(简单易懂)》(转发)。参考笔记二,P73、P74.1。目录1、JMM规范2、并发编程的三......
  • GraalVM-云原生时代的JVM(Java)
    一、GraalVM是什么?GraalVM是Oracle开源的一款通用虚拟机产品,官方称之为UniversalGraalVM,是新一代的通用多语言高性能虚拟机。它可以运行多种编程语言,如Java、JavaScript、Python等,并提供了即时编译(JIT)和AOT编译(AOT)的支持。GraalVM还支持在不同语言之间互相调用,以及嵌入到其他......
  • dbt asset-paths 简单说明
    dbt的asset-paths是一个比较有意思的配置,可以用来增强我们的文档信息,比如存放一些图片在资源描述中引用资源生成的文档中可以进行显示,提示文档的信息参考配置dbt_project.ymlasset-paths:["assets"]使用假如assets包含一些描述图片信息models/ap......
  • C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞
    视频链接:C117莫队配合bitsetP4688[Ynoi2016]掉进兔子洞_哔哩哔哩_bilibili   LuoguP4688[Ynoi2016]掉进兔子洞//莫队配合bitsetO(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<bitset>usin......