`

Set

 
阅读更多

Set 

 内部元素  无序的,不可重复元素的 collection

 API:

 

 boolean add(E e)
          如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。
 boolean addAll(Collection<? extends E> c)
          如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。
 void clear()
          移除此 set 中的所有元素(可选操作)。
 boolean contains(Object o)
          如果 set 包含指定的元素,则返回 true
 boolean containsAll(Collection<?> c)
          如果此 set 包含指定 collection 的所有元素,则返回 true
 boolean equals(Object o)
          比较指定对象与此 set 的相等性。
 int hashCode()
          返回 set 的哈希码值。
 boolean isEmpty()
          如果 set 不包含元素,则返回 true
 Iterator<E> iterator()
          返回在此 set 中的元素上进行迭代的迭代器。
 boolean remove(Object o)
          如果 set 中存在指定的元素,则将其移除(可选操作)。
 boolean removeAll(Collection<?> c)
          移除 set 中那些包含在指定 collection 中的元素(可选操作)。
 boolean retainAll(Collection<?> c)
          仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。
 int size()
          返回 set 中的元素数(其容量)。
 Object[] toArray()
          返回一个包含 set 中所有元素的数组。
<T> T[]

toArray(T[] a)
          返回一个包含此 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。

 

 

 

Set 的选择:

不包含重复元素

单线程下:

        仅需要不包含重复元素就用HashSet,

         需要按添加时顺序遍历就用LinkedHashSet、

         需要进行元素的大小排序就用TreeSet、

         仅可以包含一个枚举类型的所有实例,就用EnumSet.

 多线程下:

         需要不包含重复元素且

         需要进行key的大小排序就用ConcurrentSkipListSet

         在读取操作远过多大于写入删除操作时就用CopyOnWriteArraySet

         也可以使用Collections.synchronizedSet(Set<T>s)对任何一个非线程安全的Set进行包装而达到线程安全的目的,但迭代时必须同步迭代器,多线程频繁该问时,性能没有优势。

 

         

 

 

HashSet (内部由HashMap的 key 实现)

1 元素读取无顺序

2.允许添加一个null元素

3.插入删除速度快

4.重复的判断条件:equals及hashCode 都相等

5.非线程安全

6.创建Iterator后,对Set的修改,Iterator会报错:ConcurrentModificationException(Iterator.remove除外)

7.添加可变元素后,元素变化导至hashcode变化,将不能再定位到该元素

 

 

LinkedHashSet (内部由LinkedHashMap的KEY相关功能实现)

 1.可按插入顺序读取

 2.允许添加一个null元素

 3.顺序读取速度快

  4.重复的判断条件:equals及hashCode 都相等

  5.非线程安全

  6.创建Iterator后,对Set的修改,Iterator会报错:ConcurrentModificationException(Iterator.remove除外)

  7.添加可变元素后,元素变化导至hashcode变化,将不能再定位到该元素

 

TreeSet(内部由TreeMap的KEY相关功能实现)

   1.可按顺序读取。内部使用key实现的Comparable接口或 指定的Comparator接口 来进行比较再排序。

   2.允许添加一个null元素

   3..重复的判断条件: e.compareTo(Set里的元素)==0 或  Comparator.compare(e,Set里的元素)==0

   4.非线程安全

   5.创建Iterator后,对Set的修改,Iterator会报错:ConcurrentModificationException

 TreeSet 实现了NavigableSet  接口:

 E ceiling(E e)
          返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null
 Iterator<E> descendingIterator()
          以降序返回在此 set 的元素上进行迭代的迭代器。
 NavigableSet<E> descendingSet()
          返回此 set 中所包含元素的逆序视图。
 E floor(E e)
          返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null
 SortedSet<E> headSet(E toElement)
          返回此 set 的部分视图,其元素严格小于 toElement
 NavigableSet<E> headSet(E toElement, boolean inclusive)
          返回此 set 的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement
 E higher(E e)
          返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null
 Iterator<E> iterator()
          以升序返回在此 set 的元素上进行迭代的迭代器。
 E lower(E e)
          返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null
 E pollFirst()
          获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
 E pollLast()
          获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
 NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
          返回此 set 的部分视图,其元素范围从 fromElementtoElement
 SortedSet<E> subSet(E fromElement, E toElement)
          返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
 SortedSet<E> tailSet(E fromElement)
          返回此 set 的部分视图,其元素大于等于 fromElement
 NavigableSet<E> tailSet(E fromElement, boolean inclusive)
          返回此 set 的部分视图,其元素大于(或等于,如果 inclusive 为 true)fromElement

 

EnumSet (内部使用EnumMap)

  只能保存枚举类型的Set,并且Set里的元素只能属于同一个枚举类型。

EnumSet是抽象类,不能实例化,它的子类实现了Set接口。 

EnumSet提供了静态方法,选择合适的子类来实例化而生成Set对象:

     

static
<E extends Enum<E>>
EnumSet<E>
allOf(Class<E> elementType)
          创建一个包含指定元素类型的所有元素的枚举 set。
 EnumSet<E> clone()
          返回 set 的副本。
static
<E extends Enum<E>>
EnumSet<E>
complementOf(EnumSet<E> s)
          创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含指定 set 中所 包含的此类型的所有元素。
static
<E extends Enum<E>>
EnumSet<E>
copyOf(Collection<E> c)
          创建一个从指定 collection 初始化的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
copyOf(EnumSet<E> s)
          创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含相同的元素(如果有的话)。
static
<E extends Enum<E>>
EnumSet<E>
noneOf(Class<E> elementType)
          创建一个具有指定元素类型的空枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E first, E... rest)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2, E e3)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2, E e3, E e4)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2, E e3, E e4, E e5)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
range(E from, E to)
          创建一个最初包含由两个指定端点所定义范围内的所有元素的枚举 set。

 

  1.可按顺序读取。枚举实例的声明顺序

   2.不允许添加null元素及其它枚举类型实例

   3..重复的判断条件:e.ordinal() ==Set里的元素.ordinal()

   4.非线程安全

 

 

 

ConcurrentSkipListSet:(内部由ConcurrentSkipListMap实现)

与TreeSet类似,多了线程安全特点。

 

  1.可按顺序读取。内部使用 元素实现的Comparable接口或 指定的Comparator接口 来进行比较再排序。

   2.不允许添加一个null元素

   3..重复的判断条件: e.compareTo(Set里的元素)==0 或  Comparator.compare(e,Set里的元素)==0

   4.线程安全的

 

 

CopyOnWriteArraySet:(内部使用CopyOnWriteArrayList实现)

  1.可按插入顺序读取。

   2.允许添加一个null元素

   3..重复的判断条件:o1 == null ? o2 == null : o1.equals(o2)

   4.线程安全的,内部使用数组保存元素,当写时 新建数据并赋给原数组引用,即丢弃原数组对象。 

      

 

 

 

 

 

分享到:
评论

相关推荐

    C语言头文件 SET C语言头文件 SET

    C语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言头文件 SETC语言...

    Set5 Set14数据集

    "Set5"和"Set14"就是两个广泛使用的超分辨率数据集,主要用于测试和训练超分辨率算法。下面我们将深入探讨这两个数据集以及它们在超分辨率领域的应用。 首先,超分辨率是一种图像处理技术,它的目标是通过增加图像...

    map和set的异同

    ### Map和Set的异同分析 #### 一、概述 Map和Set作为C++ STL(Standard Template Library)中两种重要的关联容器,它们的设计理念和应用领域各有侧重,但两者之间存在着许多共性和区别。理解这两种容器的特点对于...

    Level Set Methods and Dynamic Implicit Surfaces

    Level Set Methods(水平集方法)和Dynamic Implicit Surfaces(动态隐式曲面)是计算几何中的重要概念,广泛应用于图像处理、计算物理等领域。Level Set Methods由Stanley Osher和Ronald Fedkiw等人提出,并在Osher...

    DC工具中set_dont_touch和set_size_only的区别.doc

    `set_dont_touch` 和 `set_size_only` 是 DC 中的两个关键命令,它们提供了这样的保护机制,但它们的作用方式有所不同。 首先,`set_dont_touch` 命令用于标记设计中的某些元素(如 cell、net、reference 或 design...

    set容器对类进行排序

    在C++编程中,`set`容器是STL(Standard Template Library,标准模板库)的一部分,它是一个关联容器,提供了唯一的、有序的元素存储。当我们需要对自定义类的对象进行排序时,`set`容器可以帮助我们实现这个需求。...

    set-UID实验报告

    **set-UID实验报告** 在计算机系统中,特别是在Unix和类Unix系统如Ubuntu上,set-UID(Set-User-ID)是一种特殊的权限标志,用于控制程序执行时的权限。这个标志允许一个用户运行一个程序时,该程序可以暂时获得...

    vc++ 中SetProperty()的使用解答

    在VC++编程环境中,`SetProperty()`函数是一个用于设置对象属性的方法,常见于MFC(Microsoft Foundation Classes)库中。MFC是微软提供的一套C++类库,它封装了Windows API,使得开发者能更方便地进行Windows应用...

    C++_STL之set容器使用方法

    ### C++ STL之set容器使用方法 #### 一、引言 在C++标准模板库(STL)中,`set`容器是一种非常重要的关联容器,主要用于存储唯一元素,并且这些元素会根据其键值自动排序。`set`内部通常采用红黑树(一种自平衡的二叉...

    计算机视觉数据集-Set14

    Set14数据集是计算机视觉领域的一个重要资源,主要用于研究和评估图像恢复、增强和超分辨率等技术。这个数据集由台湾中兴大学的计算机视觉研究团队在2014年发布,它针对的是那些需要小规模训练和测试神经网络的研究...

    Matlab_Active-set算法和实例

    **Matlab中的Active-set算法详解** Active-set方法是一种在优化问题中解决凸二次规划(Quadratic Programming, QP)的有效算法。它主要应用于处理约束优化问题,尤其在那些包含线性不等式约束的情况下。在Matlab...

    Easy Set Package-LG显示器的设置软件

    【LG Easy Set Package】是LG电子为用户提供的一个专门针对其显示器产品的设置工具包。这款软件主要用于帮助用户更轻松、快捷地对LG显示器进行个性化设置和优化,确保用户获得最佳的视觉体验。以下是对该软件及其...

    【JavaScript源代码】Vue.set()和this.$set()使用和区别.docx

    它们之间的差异仅在于调用方式,Vue.set()直接引用set,而this.$set()是通过原型链将set绑定到Vue实例上。 **注意事项**: - **响应式属性的添加**:在Vue实例创建后,如果尝试直接给实例添加新的属性,例如`this....

    Mysql中FIND_IN_SET()和IN区别简析

    在MySQL数据库中,`FIND_IN_SET()` 和 `IN` 是两种不同的查询方法,它们在处理数据集时有不同的特性和应用场景。本文将对这两种方法进行详细对比,以帮助理解它们之间的差异。 `FIND_IN_SET()` 函数主要用于在一个...

    SQL Server 之 SET IDENTITY_INSERT

    ### SQL Server 中 SET IDENTITY_INSERT 的使用方法及注意事项 #### 标题与描述解析 在SQL Server中,`SET IDENTITY_INSERT`是一个重要的命令,它主要用于处理标识列(即自动编号列,通常由`IDENTITY`关键字定义)...

    C# snmp get和set方法实现,含源码

    在C#中实现SNMP操作,主要包括GET和SET请求,这两个是SNMP协议的基础操作。 GET方法在SNMP中用于查询网络设备的状态或获取特定变量的值。GET请求通常由管理站(如你的C#应用程序)发起,然后由代理(网络设备)响应...

    setres适用小工具

    "setres适用小工具"是一款专为Windows PC用户设计的实用程序,主要用于调整计算机的屏幕分辨率。在日常使用中,我们可能需要更改分辨率以适应不同的显示设备或优化视觉体验。这款小工具以其简单易用、功能高效而备受...

    修改分辨率的工具SETRES

    在本文中,我们将深入探讨“修改分辨率的工具SETRES”,以及如何使用这个工具来调整计算机的显示设置。 SETRES是一个小巧实用的命令行工具,专门用于更改Windows操作系统的桌面分辨率。在没有图形化用户界面的情况...

    集合类型IntSet以及运算

    在本场景中,我们关注的是一个特定的集合类型——`IntSet`,它专门用于存储整型数值。`IntSet`通常以高效、无序且不允许重复的方式来组织数据。在本文中,我们将深入探讨`IntSet`的定义、实现和测试,以及如何在实际...

    TMS320C54x_DSP_Reference_Set_Volume_3_Algebraic_Instruction_Set.pdf

    标题:TMS320C54x_DSP_Reference_Set_Volume_3_Algebraic_Instruction_Set 描述与标签中提及的“TMS320C54x_DSP_Reference_Set_Volume_3_Algebraic_Instruction_Set.pdf”是德州仪器(Texas Instruments)针对其TMS...

Global site tag (gtag.js) - Google Analytics