Set

本文详细介绍了Java中集合类的使用,包括Set、List、Map等,以及它们的特性和适用场景。重点讨论了如何根据需求选择合适的集合类,并在多线程环境下如何保证线程安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.线程安全的,内部使用数组保存元素,当写时 新建数据并赋给原数组引用,即丢弃原数组对象。 

      

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值