精华内容
下载资源
问答
  • 判断Set集合是否包含指定对象

    万次阅读 2016-09-28 22:01:50
    2.3.4 contains方法——判断Set集合是否包含指定对象 2013-09-01 15:52:01 我来说两句  收藏 我要投稿  本文所属图书 > Java程序开发参考手册 本书是一本Java综合查询参考手册,包含...
    2.3.4 contains方法——判断Set集合是否包含指定对象
    2013-09-01 15:52:01      我来说两句 
    收藏     我要投稿  

    本文所属图书 > Java程序开发参考手册

    本书是一本Java综合查询参考手册,包含Java程序开发中常用的各种类及其方法。本书共分为4篇21章,第一篇为Java语言基础篇,主要包括包装数据类型、集合操作、日期与时间、文件处理、图片处理等内容;第二篇为桌面...   立即去当当网订购

    contains方法用来判断Set集合是否包含指定的对象。

    语法  boolean contains(Object o) 

    返回值:如果Set集合包含指定的对象,则返回true;否则返回false。

    参数:o是要查询的对象。

    示例  本示例使用HashSet类构建Set集合对象,并添加一些内容,然后使用contains方法判断Set集合是否包含指定的对象。

    public static void main(String[] args) {

        Set set = new HashSet();
        set.add(new Date());   //向列表中添加数据

        set.add("apple");    //向列表中添加数据

        set.add(new Socket());   //向列表中添加数据

        boolean contains = set.contains("apple");

        if (contains) {

       System.out.println("Set集合包含字符串apple");

        } else {

       System.out.println("Set集合不包含字符串apple");

        }

    }

    展开全文
  • Set集合介绍Set集合的概念  Set集合类似于一个容器,程序把很多对象保存到Set集合中。Set集合对添加顺序不记录,当有重复的对象保存到Set集合时,不会新增后加的重复对象Set集合的特点Set集合无重复元素,add()...

    f7070a22beabdef51db4f57626f215d6.png

    引言

            学完 List集合详解,多多少少对集合有所了解了,下面一起继续打怪升级学一学Set集合是怎么使用的。

    Set集合介绍

    Set集合的概念

      Set集合类似于一个容器,程序把很多对象保存到Set集合中。Set集合对添加顺序不记录,当有重复的对象保存到Set集合时,不会新增后加的重复对象。

    Set集合的特点

    1. Set集合无重复元素,add()方法添加相同元素时,返回false;
    2. Set集合add()方法不记录顺序;

    HashSet类

    HashSet介绍

      HashSet是按照哈希算法进行存储元素的,具有良好的查询和存取性能。

    HashSet特点

    1. 集合元素值可以为null;
    2. 不保证元素的排列顺序,有可能排列顺序与添加顺序不同;
    3. 非同步集合,多线程访问HashSet时,是不安全的,需要通过同步代码保证同步;
    4. 元素不可重复相同,通过equals()hashCode()方法一起判断是否相同。

    HashSet添加元素原理

    add()方法源码

    public boolean add(E e) {

      通过add()方法向HashSet存入元素时,HashSet会调用该对象的hashCode()方法获取hashCode值,然后根据hashCode值决定这个元素在HashSet的存储位置。如果有两个元素通过equals()方法返回true,但hashCode()方法返回值不同,则HashSet会存储到集合的不同位置,依旧可以成功添加该元素。

    HashSet示例

    HashSet中元素对象的相同性依据

    1)创建ClassA类,重写equals()方法

    public 

    2)创建ClassB类,重写hashCode()方法

    public 

    3)创建ClassC类,重写equals()hashCode()方法

    public 

    4)测试主类:

    public 

    5)运行结果:

    hashSet: 
    com.example.andya.demo.bean.ClassB@0
    com.example.andya.demo.bean.ClassB@0
    com.example.andya.demo.bean.ClassC@1
    com.example.andya.demo.bean.ClassA@1edf1c96
    com.example.andya.demo.bean.ClassA@368102c8

      从上述运行结果可以看出:
    1)HashSet集合添加顺序和集合内部元素顺序不一定相同;
    2)HashSet添加元素时:

    • ClassA类重写了equals()方法,但是两个对象的hashCode()返回了不同的hashCode值,所以HashSet会将这两个对象保存在哈希表中的不同位置。
    • ClassB类重写了hashCode()方法,但是两个对象的equals()方法返回的是不同的对象地址,所以HashSet会将这两个对象保存到同一个位置,并通过链表链接。这种方式不建议有,因为集合中出现链式结构来存储相同hash值的元素时,查询速度会变慢,性能下降。
    • 只有ClassC是当作一个对象来添加到集合中,只有当equals()hashCode()方法都重写的时候,才可以作为判断对象是否相同的依据。

    3)总结:若需要将某个类的对象保存到HashSet集合时,我们需要重写这个类的equals()hashCode()方法,只有保证了两个对象通过equals()方法返回true,hashCode()方法返回值相同时,才是相同对象。

    重写hashCode()方法的准则

    既然要重写hashCode(),我们就看看有啥限制吧:

    1. 可重复性:程序运行时,同一个对象多次调用hashCode()方法返回的是相同值;
    2. 当两个对象通过equals()方法比较后返回的是true,则两个对象的hashCode()方法应返回相同的hash值;
    3. 对象中用作equals()方法比较标准的实例变量,都应该用于计算hashCode值;

    HashSet集合为何查询速度快?

      我们回答这个问题前,先看一下HashSet添加元素的流程,使用add()方法添加元素时,HashSet会根据这个元素的hashCode值计算存储位置进行存储。   所以,为啥查询快?那是因为我们查询元素时,也是通过该元素的hashCode值快速定位到该元素在集合中的位置,其实HashSet底层是通过HashMap实现的。可以观察到源码:

    public 

    LinkedHashSet

    LinkedHashSet介绍

      LinkedHashSet是HashSet子类,同样是根据元素的hashCode值判断元素的存储位置,且同时使用链表维护元素的顺序,给人的直观效果就是集合的顺序就是元素插入的顺序保存的。
      下面我们通过一组示例来看一下LinkedHashSet的保存元素次序效果。

    LinkedHashSet示例

    1)主类

    public 

    2)运行结果

    1, 

      从上述运行结果中,我们可以看到LinkedHashSet的元素保存顺序即为添加元素的顺序。

    TreeSet

    TreeSet介绍

      TreeSet是SortedSet接口实现类,TreeSet是一种排序集合,该对象中只能添加一种类型元素,否则,会抛出java.lang.ClassCastException异常;
      与HashSet集合采用hash算法来决定元素的存储位置有些不一样,TreeSet是采用红黑树这种数据结构存储集合元素。

    TreeSet方法

    除了Collection集合的常用方法外,TreeSet集合还有如下常用方法:

    • Comparator super E> comparator():如果TreeSet采用定制排序,该方法返回定制排序所使用的Comparator,如果TreeSet采用自然排序,则返回null;
    • E first():返回集合中的第一个元素;
    • E last():返回集合中的最后一个元素;
    • E lower(E e):返回集合找找那个微语指定元素之前的元素(小于指定元素的最大元素)
    • E higher(E e):返回集合中位于指定元素之后元素(大于指定元素的最小元素)
    • SortedSet subSet(E fromElement, E toElement) :返回Set的子集合,从fromElement(包含)到toElement(不包含)
    • SortedSet headSet(E toElement):返回此Set的子集,该子集是由小于toElement的元素组成;
    • SortedSet tailSet(E toElement):返回此Set的子集,该子集是由大于toElement的元素组成;

    TreeSet示例

    1)运行主类:

    public 

    2)运行结果:

    1, 

      从上述运行结果可以看出,TreeSet不是根据添加元素的顺序进行排序,而是通过元素实际大小进行排序。

    TreeSet的compareTo()方法详解

      TreeSet支持两种排序方式:自然排序自定义排序(定制排序)

    自然排序

    介绍:
      TreeSet是通过Comparable接口的compareTo(Object obj)方法比较元素之间的大小关系,然后将元素按照升序排列,即为自然排序。实现原理:
      实现Comparable接口,并实现compareTo(Object obj)方法,返回一个整数值。当一个对象调用该方法与另一个对象进行比较时,如obj1.compareTo(obj2),该方法若返回0,则表明obj1和obj2这两个对象相等;若返回一个正整数,则表明obj1大于obj2;若返回一个负整数,则表明obj1小于obj2。然后根据红黑树结构寻找存储位置,当元素相同,若此时使用集合add()方法时,无法将新对象添加到集合内。
      TreeSet通过元素对应的类重写的compareTo(Object obj)方法来比较对象大小,就要求重写元素对象对应类的equals()方法时,需要保证该方法与compareTo(Object obj)方法保持一致的结果,当两个对象通过equals()方法返回true时,两个对象通过compareTo(Object obj)方法应该返回0。

    示例
    1)对象类

    public 

    2)运行类

    public 

    3)运行结果

    3, name=

      从上述运行结果看出,对象类OnePerson添加到TreeSet时是按照age大小进行排序添加进集合。

    自定义排序

    介绍:
      自然排序是根据元素大小进行升序排列,如果需要实现降序等排列需要自定义排序,通过Comparator接口,该接口内有int compare(T o1, T o2)方法,使用该方法比较o1和o2的大小:若返回正整数,则表示o1>o2;若返回负整数,则表示o1实现原理:
      创建TreeSet集合对象时,提供一个Comparator对象与该集合进行关联,在Comparator对象中实现集合元素的排序逻辑。

    示例
    1)对象类

    public 

    2)运行主类: Lambda方式

    public 

    compare()方式

    public 

    3)运行结果

    9, name=

      从上述运行结果看出,通过Comparator接口的lambda表达式实现了自定义降序。

    EnumSet

    EnumSet介绍

      EnumSet是一个枚举类的集合类,集合内的所有元素都必须是指定枚举类型的枚举值,枚举类型在创建EnumSet时显式或者隐式地指定;EnumSet也是有顺序的,该顺序是由枚举值在Enum类中的定义顺序决定。   EnumSet不允许加入null元素,若尝试添加null元素,会抛出NullPointerException异常。

    ##
    EnumSet常用方法

    • EnumSet allOf(Class elementType):创建一个包含指定枚举类全部枚举值的EnumSet集合。
    • EnumSet noneOf(Class elementType):创建一个元素类型为指定枚举类型的空EnumSet集合。
    • EnumSet of(E first, E... rest) :创建同一类型枚举值的一个或多个枚举值的EnumSet集合。
    • EnumSet range(E from, E to):创建一个包含从from到to枚举值范围内所有枚举值的EnumSet集合。
    • EnumSet complementOf(EnumSet s):创建一个元素类型和指定的EnumSet集合相同的EnumSet集合,新EnumSet集合包含原EnumSet集合不包含的,新的EnumSet集合和原集合所有元素加起来是枚举类的所有枚举值。
    • EnumSet copyOf(EnumSet s):创建一个与指定EnumSet集合具有相同元素类型、相同元素值的EnumSet集合。
    • EnumSet copyOf(Collection c) :使用一个普通集合创建EnumSet集合。但是该普通集合中的元素必须是枚举值,否则会抛出ClassCastException异常。

    EnumSet示例

    1)枚举类

    public 

    2)运行主类

    public 

    3)运行结果

    allOf()方法:[RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, PURPLE]
    noneOf()方法:[RED, GREEN]
    of()方法:[ORANGE, BLUE]
    range()方法:[ORANGE, YELLOW, GREEN, BLUE, INDIGO]
    complementOf()方法:[RED, PURPLE]
    copyOf()方法:[RED, PURPLE]

    Set集合的比较

    性能比较

    1. HashSet性能比TreeSet好(添加、查询),只有当需要保持排序的Set时,才使用TreeSet,否则使用HashSet。
    2. HashSet比LinkedHashSet性能好(添加、删除)。
    3. LinkedHashSet比HashSet性能好(遍历查询)。
    4. EnumSet是所有Set性能最好的,但缺陷是只能保存同一个枚举类的枚举值作为集合元素。
    5. HashSet、TreeSet和EnumSet都是线程不安全的,需要通过Collections工具类的synchronizedSet(Set s)synchronizedSortedSet(SortedSet s)方法来包装Set集合。

    参考
    JDK 1.8源码

    7f846940df8c9b737744d3be6bdd686d.gif

    [每篇微语]

    让自己高兴起来的最好办法,就是设法让别人高兴起来。

                                                 —— 林肯

    展开全文
  • set集合

    2018-07-26 09:48:23
    set集合中的对象不按照特定的方式排序,只是简单的吧对象加入集合之中,但是set集合不能包含重复对象set集合set接口和set接口实现类组成,set接口继承了collection接口所有方法。 注意,set只有一个约束条件,...

    set集合中的对象不按照特定的方式排序,只是简单的吧对象加入集合之中,但是set集合不能包含重复对象。set集合由set接口和set接口实现类组成,set接口继承了collection接口所有方法。

    注意,set只有一个约束条件,就是不能存在重复对象

    Set常用集合:
        Set中方法与Collection一致。

        (1)HashSet:内部数据结构是哈希表,是不同步的。
            Set集合中元素都必须是唯一的,HashSet作为其子类也需保证元素的唯一性。
            判断元素唯一性的方式:
               通过存储对象(元素)的hashCode和equals方法来完成对象唯一性的。
               如果对象的hashCode值不同,那么不用调用equals方法就会将对象直接存储到集合中;
               如果对象的hashCode值相同,那么需调用equals方法判断返回值是否为true,
                若为false, 则视为不同元素,就会直接存储;
                若为true, 则视为相同元素,不会存储。
            
         PS:如果要使用HashSet集合存储元素,该元素的类必须覆盖hashCode方法和equals方法。
         一般情况下,如果定义的类会产生很多对象,通常都需要覆盖equals,hashCode方法。建立对象判断是否相同的依据。
        
        (2)TreeSet:保证元素唯一性的同时可以对内部元素进行排序,是不同步的。
            判断元素唯一性的方式:
               根据比较方法的返回结果是否为0,如果为0视为相同元素,不存;如果非0视为不同元素,则存。
            TreeSet对元素的排序有两种方式:
                方式一:使元素(对象)对应的类实现Comparable接口,覆盖compareTo方法。这样元素自身具有比较功能。
                方式二:使TreeSet集合自身具有比较功能,定义一个类实现Comparable接口覆盖其compareTo方法。(相当于自定义了一个比较器)
                    将该类对象作为参数传递给TreeSet集合的构造函数。(TreeSet(Comparator<? super E> c) )

     

     

    展开全文
  • Java 集合类中的 Set.add() 方法用来向 ...如果 Set 集合中已经包含相同的对象,则不改变 Set 集合。 该方法返回值为 boolean 对象,如果 Set 集合中不包含要添加的对象,则添加对象并返回 true,否则返回 false。 ...

    Java 集合类中的 Set.add() 方法用来向 Set 集合添加对象。
    如果 Set 集合中已经包含相同的对象,则不改变 Set 集合。
    该方法返回值为 boolean 对象,如果 Set 集合中不包含要添加的对象,则添加对象并返回 true,否则返回 false。

    展开全文
  • 使用Set集合的去重机制,结合lombok注解实现基本数据类型集合,对象集合的去重 一、引入lombok 在pom.xml文件中,加入以下依赖: <!--lombok注解--> <dependency> <groupId>org.project...
  • Set接口是Collection的子接口... Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法。因此存放到Set集合中的元素一定要注意equals方法的重写。Set的常用实现类有:HashSet、TreeSet、LinkedHashSe...
  • Set集合

    2018-01-30 15:32:42
     Set集合类似一个罐子,程序可依次把多个对象丢进Set集合,而Set集合通常不能记住元素的添加顺序。Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回...
  • Set对象允许存储任何类型的唯一值,无论是原始值还是对象引用。可用于数组,集合去重等操作,拥有size属性 const set1 = new Set([1, 2, 3, 4, 5,4]); console.log(set1.has(1)); // expected output: true ...
  • 参考:<<Redis设计与实现>> ...intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。 创建一个使用intset编码的集合对象: redis> s...
  • js 双线性插值 双三次插值法 实现Set介绍Set添加对象扩展Set,...但是Set集合的元素,如果添加多个对象,则除非是同一个对象,才可以去重。如果添加多个对象,但是对象中的属性和值都相同,由于Set是采用 === 比较对象
  • Set集合中使用add方法添加对象

    万次阅读 2017-07-30 13:01:15
    1)、如果Set集合中已经给定包含相同的对象时,则不改变原来Set集合。 语法 boolean add(E e)  返回值:如果Set集合中不包含要添加的对象,则添加对象并返回true;否则返回false。 参数:e是要添加到...
  • Java Set集合

    2019-05-13 21:43:08
    下面小编给大家讲Set集合Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则...
  • 集合之间不能存储基本数据类型,也不能之间存储 java 对象集合当中存在的是内存地址。list.add(100); // 自动装箱 (Integer)集合也是一个对象,也有内存地址。在 java 中每一个不同的集合,底层会对应不同的数据...
  • Set 集合是由一串无序的,不能重复的相同类型元素构成的集合。 List集合中的元素是有序的、可重复的,而Set集合中的元素是无序的、不能重复的。List集合强调的是有序,Set集合强调的是不重复。当不考虑顺序,且没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 453,914
精华内容 181,565
关键字:

set对象集合是否包含