HashSet

构造方法

由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素
此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
 
   Set s = Collections.synchronizedSet(new HashSet(...));

构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75
  1. private transient HashMap<E,Object> map;
  2. public HashSet() {
  3. map = new HashMap<E,Object>();
  4. }

有参数构造方法
  1. public HashSet(Collection<? extends E> c) {
  2. map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
  3. addAll(c);
  4. }

 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子
  1. public HashSet(int initialCapacity, float loadFactor) {
  2. map = new HashMap<E,Object>(initialCapacity, loadFactor);
  3. }
构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。 
  1. public HashSet(int initialCapacity) {
  2. map = new HashMap<E,Object>(initialCapacity);
  3. }

方法

返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
  1. public Iterator<E> iterator() {
  2. return map.keySet().iterator();
  3. }


遍历

  1. Set<String> set = Collections.synchronizedSet(new HashSet<String>());
  2. set.add("111");
  3. set.add(null);
  4. set.add("222");
  5. set.add("222");
  6. set.add("333");
  7. // 遍历set
  8. Iterator<String> iterator = set.iterator();
  9. while(iterator.hasNext()){
  10. System.out.print(iterator.next()+" ");
  11. }
  12. //output null 222 333 111
增强for循环也可遍历
for (String string : set) {
            System.out.println(string);
        } 
 

返回set大小,(实际是返回底层实现hashMap的大小)
  1. public int size() {
  2. return map.size();
  3. }

  1. //判断是否为空也是判断实现的map
  2. public boolean isEmpty() {
  3. return map.isEmpty();
  4. }

重点到了》》

set判断是否存在元素,是判断map 是否存在key,so,不能重复就可以理解了吧
  1. public boolean contains(Object o) {
  2. return map.containsKey(o);
  3. }

set重复添加对象

啦啦啦,又是重点,set 添加元素,放进map 的key,要是set重复添加对象怎么处理呢
添加了会返回是否添加成功,so,我们打印下,
map 中的PRESENT 是对象,空对象哟,看final
 private static final Object PRESENT = new Object();  
  1. public boolean add(E o) {
  2. return map.put(o, PRESENT)==null;
  3. }
  1. Set<String> set = Collections.synchronizedSet(new HashSet<String>());
  2. set.add("111");
  3. System.out.println(set.add("111"));
  4. //output false
我们发现了什么,已经存在的话,再添加返回false,没有替换,只是不添加,减少了资源消耗,(
这里涉及map 的添加,我们发现,map添加重复key时候,返回已经存在的key,对应值,so,没有添加,只有不存在重复才添加








posted @ 2015-05-09 21:11  liubo6  阅读(232)  评论(0编辑  收藏  举报