Concept
HashSet是Set接口的实现类,以哈希表的结构为支持。
HashSet并不能保证集合中的顺序,也就是存取顺序可能不一样。
HashSet也允许有null的出现。
HashSet是基于HashMap实现的,底层用HashMap来保存元素。
HashSet的迭代时间与HashSet中元素和容量之和成正比关系,所以如果迭代性能在这里很重要,就不要把初始容量设置得过高。
HashSet并不是同步的。如果有多个线程同时存取HashSet且至少有一个线程来修改set,它必须实现外部同步。这通常是通过同步一些可以自动包装set的对象来完成这项操作,如果没有这类对象,那我们就使用Collections.synchronizedSet的方法来包装。
如果set在迭代器创建后,除了迭代器自己调用了remove方法,一旦发生set数据修改就会抛出ConcurrentModicationException异常。这就保证了set在面对并发修改时会快速且干脆地报错。但是我们写程序不能依赖于这项机制,它只能被应用于发现bug。
创建HashSet
HashSet<E> set = new HashSet<>();
Method
Type | Method | Significance |
---|---|---|
boolean | add(E e) | 返回是否成功往set中添加元素 |
void | clear() | 清除set中所有元素 |
Object | clone() | 返回一个HashSet的浅拷贝对象,元素本身没有被clone |
boolean | contains(Object o) | set中是否有指定元素 |
boolean | isEmpty() | set是否为空 |
Iterator<E> | iterator() | 返回一个调用set中元素的迭代器 |
boolean | remove(Object o) | 是否成功清除set中指定元素 |
int | size() | 返回set中元素个数 |
Example
public class test{
public static void main(String args[]) {
HashSet<String> set1 = new HashSet<>();
HashSet<String> set2;
// 建立两个HashSet 元素类型为String
set1.add("Study");
set1.add("Everyday");
set1.add("University");
System.out.println("set1的HashSet:" + set1);
// 用add往set1中加三个对象
set2 = (HashSet)set1.clone();
set2.remove("Study");
System.out.println("拷贝后的HashSet:" + set2);
System.out.println("原来的HashSet:" + set1);
// 运用set1的clone方法拷贝给set2 因为是软拷贝 set1没有变化
set2.clear();
System.out.println(set2.isEmpty());
// 清除数据后 看set2是否为空
System.out.println(set1.contains("Study"));
System.out.println(set1.size());
// 判断set1中是否有指定元素 并且计算set1中的元素个数
Iterator iter = set1.iterator();
while(iter.hasNext()){
String s = (String)iter.next();
System.out.println(s);
}
// 用迭代器输出set1中的每一个string对象
}
}
运行结果
set1的HashSet:[Study, University, Everyday]
拷贝后的HashSet:[Everyday, University]
原来的HashSet:[Study, University, Everyday]
true
true
3
Study
University
Everyday
这里的输出顺序与之前的存入顺序不一样,也可以说明我们通过输入并不能保证元素在集合中的顺序。