4
回答
HashSet源码问题
滴滴云服务器,限时包月0.9元,为开发者而生>>>   
HashSet有一个构造方法:
public HashSet(Collection<? extends E> c) { map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c);  }

这里面调用了addAll(c)这个方法,这个方法是AbstrctCollection中的方法,源码如下


public boolean addAll(Collection<? extends E> c) { boolean modified = false; Iterator<? extends E> e = c.iterator(); while (e.hasNext()) { if (add(e.next()))
   modified = true; } return modified;  }

  这里面通过迭代器判断了c中的每一个值是否会报错,但是没看到c的值是如何加入到HashSet里面的map中去的啊?请问它是如何做到添加进map的?

ps:if(add(e.next))中的add(e.next)只是一个判断的方法,并不是添加,源码如下:

public boolean add(E e) { throw new UnsupportedOperationException();  }


举报
弧线之内
发帖于2年前 4回/153阅
共有4个答案 最后回答: 2年前
注意此时调用的是方法add,这里实现了多态,调用的是具体实现类里的add方法,也就是你hashset的实现的add方法
引用代码的正确姿势如下,你用的是常规引用,显示有问题。
public boolean addAll(Collection<? extends E> c)
{
    boolean modified = false;
    Iterator<? extends E> e = c.iterator();
    while (e.hasNext())
    {
        if (add(e.next()))
            modified = true;
    }
    return modified;
}

上面的变量e,集合c的迭代器,用于遍历操作。

循环体的条件是:只要后面还有元素,就继续

e.next()就是在这个集合里取值(取的是下一个元素)

所以,add(e.next())就是将集合成员一个一个添加进去的操作。

它判断的不是“c中每一个值是否会报错”,而是检查对每一个值的添加操作是否出错。


<p>Note that this implementation will throw an * <tt>UnsupportedOperationException</tt> unless <tt>add</tt> is * overridden (assuming the specified collection is non-empty).
顶部