JAVA集合框架之Set接口实现类

时间:2022-04-03 19:23:41

在上一篇《JAVA集合框架》中为大家介绍了JAVA集合框架的基本组成,这一片开始将为大家介绍集合框架中常用的实现类的用法。

java.util.HashSet< E >

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。这是我们最常用的Set接口的实现类。

构造方法

方法名 说明
HashSet() 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75
HashSet(Collection< ? extends E> c) 构造一个包含指定 collection 中的元素的新 set
HashSet(int initialCapacity) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)
HashSet(int initialCapacity, float loadFactor) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子

方法摘要

返回值 方法名 说明
boolean add(E e) 如果此 set 中尚未包含指定元素,则添加指定元素
void clear() 从此 set 中移除所有元素
Object clone() 返回此 HashSet 实例的浅表副本:并没有复制这些元素本身
boolean contains(Object o) 如果此 set 包含指定元素,则返回 true
boolean isEmpty() 如果此 set 不包含任何元素,则返回 true
Iterator< E > iterator() 返回对此 set 中元素进行迭代的迭代器
boolean remove(Object o) 如果指定元素存在于此 set 中,则将其移除
int size() 返回此 set 中的元素的数量(set 的容量)

使用示例

import java.util.HashSet;
import java.util.Iterator;

public class HashSetDemo
{

public static void main(String[] args)
{
// 创建一个HashSet对象,<String>为泛型,表明HashSet中的元素必须是String类型
HashSet<String> set = new HashSet<String>();
// 添加元素
set.add("jiang");
set.add("gu");
set.add("jin");
System.out.println("集合中的元素个数为:" + set.size());
// 判断集合中是否包含指定元素
System.out.println(set.contains("jiang"));
// 遍历集合中的元素
System.out.println("集合中的元素为(迭代器Iterator):");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
System.out.println(iterator.next());
}
System.out.println("集合中的元素为(foreach):");
for (String item : set)
{
System.out.println(item);
}
}
}

运行结果:
集合中的元素个数为:3
true
集合中的元素为(迭代器Iterator):
jin
jiang
gu
集合中的元素为(foreach):
jin
jiang
gu

需要注意的是,遍历元素时,打印输出的顺序可能与上述结果不同,因为HashSet它不保证迭代顺序,特别是它不保证该顺序恒久不变。如果我们想要元素迭代顺序与添加顺序相同,那么我们可以使用HashSet的子类java.util.LinkedHashSet<E>,该类用法与HashSet相同,就不在举例子了。

java.util.TreeSet< E >

有时候,我们对集合种元素的顺序有更高的要求,我么需要元素按自然顺序排序,TreeSet就为我们提供了这样的功能。TreeSet使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

构造方法

方法名 说明
TreeSet() 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序
TreeSet(Collection< ? extends E> c) 构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序
TreeSet(Comparator< ? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序
TreeSet(SortedSet< E> s) 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet

方法摘要

返回值 方法名 说明
boolean add(E e) 将指定的元素添加到此 set(如果该元素尚未存在于 set 中)
boolean addAll(Collection< ? extends E> c) 将指定 collection 中的所有元素添加到此 set 中
E ceiling(E e) 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null
void clear() 移除此 set 中的所有元素
Object clone() 返回 TreeSet 实例的浅表副本
Comparator< ? super E> comparator() 返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回null
boolean contains(Object o) 如果此 set 包含指定的元素,则返回 true
Iterator< E> descendingIterator() 返回在此 set 元素上按降序进行迭代的迭代器
NavigableSet< E> descendingSet() 返回此 set 中所包含元素的逆序视图
E first() 返回此 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
boolean isEmpty() 如果此 set 不包含任何元素,则返回 true
Iterator< E> iterator() 返回在此 set 中的元素上按升序进行迭代的迭代器
E last() 返回此 set 中当前最后一个(最高)元素
E lower(E e) 返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null
E pollFirst() 获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
E pollLast() 获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
boolean remove(Object o) 将指定的元素从 set 中移除(如果该元素存在于此 set 中)
int size() 返回 set 中的元素数(set 的容量)
NavigableSet< E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) 返回此 set 的部分视图,其元素范围从 fromElement 到 toElement
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

使用示例

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo
{

public static void main(String[] args)
{
// 创建一个TreeSet对象,<String>为泛型,表明TreeSet中的元素必须是String类型
TreeSet<String> set = new TreeSet<String>();
// 添加元素
set.add("jiang");
set.add("gu");
set.add("jin");
System.out.println("集合中的元素个数为:" + set.size());
// 判断集合中是否包含指定元素
System.out.println(set.contains("jiang"));
System.out.println("集合中第一个元素为:" + set.first());
System.out.println("集合中最后一个元素为:" + set.last());
// 遍历集合中的元素
System.out.println("集合中的元素为(迭代器Iterator):");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
System.out.println(iterator.next());
}
System.out.println("集合中的元素为(foreach):");
for (String item : set)
{
System.out.println(item);
}
}
}

通过上面的例子,其实我们可以发现TreeSet和HashSet的用法也是非常类似的。