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");// 遍历setIterator<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();}
//判断是否为空也是判断实现的mappublic 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,没有添加,只有不存在重复才添加
)

浙公网安备 33010602011771号