1.介绍
HashSet 是一个没有重复元素的集合。
它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素。
HashSet是非同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
Set s = Collections.synchronizedSet(new HashSet(...));
1.1 构造函数
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 实例具有指定的初始容量和指定的加载因子。 |
1.2 常用方法
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 的容量)。 |
1.3 遍历方式
// 通过Iterator遍历HashSet 。推荐方式
public static void iteraHashSet(HashSet set) {
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.printf("iterator : %s\n", iterator.next());
}
}
// 通过for-each遍历HashSet.不推荐!此方法需要先将Set转换为数组
public static void foreachHashSet(HashSet set) {
String[] arr = (String[]) set.toArray(new String[0]);
for (String str:arr){
System.out.printf("for each : %s\n", str);
}
}
public class HashSetE {
public static void main(String[] args) {
testHashSetApis();
}
public static void testHashSetApis() {
//新建HashSet
HashSet<String> set = new HashSet();
//添加元素到HashSet
for (int i = 0; i < 5; i++) {
set.add("" + i);
}
//iteraHashSet(set);
//foreachHashSet(set);
//打印HashSet的实际大小
System.out.printf("size:%d\n",set.size());
//判断HashSet 是否包含某个值
System.out.printf("HashSet contains a :%s\n", set.contains("a"));
//删除对象
set.remove("1");
//新建一个包含2,3,4的HashSet
HashSet otherset=new HashSet();
otherset.add("2");
otherset.add("3");
//克隆一个removeset,内容和set 一模一样
HashSet removeset=(HashSet) set.clone();
//删除“removeset中,属于othersSet的元素”
removeset.removeAll(otherset);
//打印removeset
System.out.printf("removeset : %s\n", removeset);
HashSet retainset=(HashSet)set.clone();
retainset.retainAll(otherset);
System.out.printf("retainset : %s\n", retainset);
//清空HashSet
set.clear();
//输出Hashset 是否为空
System.out.printf("%s\n",set.isEmpty()?"isEmpty":"not isEmpty");
}
// 通过Iterator遍历HashSet 。推荐方式
public static void iteraHashSet(HashSet set) {
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.printf("iterator : %s\n", iterator.next());
}
}
// 通过for-each遍历HashSet.不推荐!此方法需要先将Set转换为数组
public static void foreachHashSet(HashSet set) {
String[] arr = (String[]) set.toArray(new String[0]);
for (String str:arr){
System.out.printf("for each : %s\n", str);
}
}
}