HashSet
构造方法
由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素
此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
Set s = Collections.synchronizedSet(new HashSet(...));
构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75
private transient HashMap<E,Object> map;
public HashSet() {
map = new HashMap<E,Object>();
}
有参数构造方法
public HashSet(Collection<? extends E> c) {
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
方法
返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
public Iterator<E> iterator() {
return map.keySet().iterator();
}
遍历
Set<String> set = Collections.synchronizedSet(new HashSet<String>());
set.add("111");
set.add(null);
set.add("222");
set.add("222");
set.add("333");
// 遍历set
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
//output null 222 333 111
增强for循环也可遍历
for (String string : set) {
System.out.println(string);
} 返回set大小,(实际是返回底层实现hashMap的大小)
public int size() {
return map.size();
}
//判断是否为空也是判断实现的map
public boolean isEmpty() {
return map.isEmpty();
}
重点到了》》
set判断是否存在元素,是判断map 是否存在key,so,不能重复就可以理解了吧
public boolean contains(Object o) {
return map.containsKey(o);
}
set重复添加对象
啦啦啦,又是重点,set 添加元素,放进map 的key,要是set重复添加对象怎么处理呢
添加了会返回是否添加成功,so,我们打印下,
map 中的PRESENT 是对象,空对象哟,看final
private static final Object PRESENT = new Object();
public boolean add(E o) {
return map.put(o, PRESENT)==null;
}
Set<String> set = Collections.synchronizedSet(new HashSet<String>());
set.add("111");
System.out.println(set.add("111"));
//output false
我们发现了什么,已经存在的话,再添加返回false,没有替换,只是不添加,减少了资源消耗,(
这里涉及map 的添加,我们发现,map添加重复key时候,返回已经存在的key,对应值,so,没有添加,只有不存在重复才添加
)