直通车:Java集合框架系列目录
- 基本概念
- 继承关系
- 结构特点
- 常用API
- 遍历方式
- 代码示例
1.基本概念
HashSet:一种没有重复元素的无序集合。
2.继承关系
HashSet是一个继承于AbstractSet
的散列集。
HashSet实现了Cloneable
接口,即覆盖了函数clone()
,能被克隆。
HashSet实现java.io.Serializable
接口,意即HashSet支持序列化,能通过序列化传输。
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable { }
3.结构特点
- 基于HashMap实现
HashSet中含有一个HashMap类型的成员变量map,HashSet的操作函数实际上都是通过map实现的。
// HashSet类中使用HashMap来保存所有元素。
private transient HashMap<E,Object> map;
- 没有重复元素
哈希表判断元素是否相同:
判断的是两个元素的哈希值是否相同(HashCode),如果相同,再判断两个对象的内容是否相同(equals)。
如果equals不相等,那么hashcode可能相等;
如果equals相等,那么hashcode一定相等。
如果hashcode相等,那么equals可能相等;
如果hashcode不相等,那么equals一定不相等。
- 允许使用 null 元素
由于null==null
为true,因而HashSet中只能存储一个null元素。 - 不是线程安全的
可以用Collections的synchronizedSet方法使HashSet具有线程安全的能力。
Set<T> set = new HashSet<T>(); // 非同步,非线程安全的Set
Set<T> syncSet = Collections.synchronizedSet(set);
// 返回了一个线程安全的Set
4.常用API
返回类型 | 函数名 |
---|---|
boolean | add(E object) |
void | clear() |
Object | clone() |
boolean | contains(Object object) |
boolean | isEmpty() |
Iterator | iterator() |
boolean | remove(Object object) |
int | size() |
5.遍历方式
1.通过Iterator遍历HashSet
第一步:根据iterator()获取HashSet的迭代器。
第二步:遍历迭代器获取各个元素。
// 假设set是HashSet对象
for(Iterator iterator = set.iterator();
iterator.hasNext(); ) {
iterator.next();
}
2.通过for-each遍历HashSet
第一步:根据toArray()获取HashSet的元素集合对应的数组。
第二步:遍历数组,获取各个元素。
// 假设set是HashSet对象,并且set中元素是String类型
String[] arr = (String[])set.toArray(new String[0]);
for (String str:arr)
System.out.printf("for each : %s\n", str);
6.代码示例
import java.util.Random;
import java.util.Iterator;
import java.util.HashSet;
/*
* @desc 介绍HashSet遍历方法
*
* @author skywang
*/
public class HashSetIteratorTest {
public static void main(String[] args) {
// 新建HashSet
HashSet set = new HashSet();
// 添加元素 到HashSet中
for (int i=0; i<5; i++)
set.add(""+i);
// 通过Iterator遍历HashSet
iteratorHashSet(set) ;
// 通过for-each遍历HashSet
foreachHashSet(set);
}
/*
* 通过Iterator遍历HashSet。推荐方式
*/
private static void iteratorHashSet(HashSet set) {
for(Iterator iterator = set.iterator();
iterator.hasNext(); ) {
System.out.printf("iterator : %s\n", iterator.next());
}
}
/*
* 通过for-each遍历HashSet。不推荐!此方法需要先将Set转换为数组
*/
private 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);
}
}
import java.util.HashSet;
import java.util.Set;
public class SetTest {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
System.out.println(set.add(3));
set.add(4);
set.add(2);
set.add(null);
set.add(null);set.add(null);
System.out.println(set.size());
System.out.println(set.contains(4));
set.clear();
System.out.println(set.size());
}
}
如有谬误或不完善之处,恳请斧正!