构造方法
由哈希表(实际上是一个 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,没有添加,只有不存在重复才添加
)
HashSet
原文:http://www.cnblogs.com/liubo6/p/4491184.html