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(); }
注意此时调用的是方法add,这里实现了多态,调用的是具体实现类里的add方法,也就是你hashset的实现的add方法
PleaseAdd
<spanstyle="line-height:1.5;font-size:10pt;">上面的变量e,集合c的迭代器,用于遍历操作。
<spanstyle="line-height:1.5;font-size:10pt;"><spanstyle="font-size:13.3333px;">循环体的条件是:只要后面还有元素,就继续
e.next()就是在这个集合里取值(取的是下一个元素)
所以,add(e.next())就是将集合成员一个一个添加进去的操作。
它判断的不是“c中每一个值是否会报错”,而是检查对每一个值的添加操作是否出错。
<spanstyle="color:<atarget='_blank'>#808080;background-color:#e2ffe2;font-style:italic;"><p><spanstyle="color:#808080;font-style:italic;">Notethatthisimplementationwillthrowan<spanstyle="color:#808080;font-style:italic;">*<spanstyle="color:<atarget='_blank'>#808080;background-color:#e2ffe2;font-style:italic;"><tt><spanstyle="color:#808080;font-style:italic;">UnsupportedOperationException<spanstyle="color:#808080;background-color:#e2ffe2;font-style:italic;"></tt><spanstyle="color:#808080;font-style:italic;">unless<spanstyle="color:<atarget='_blank'>#808080;background-color:#e2ffe2;font-style:italic;"><tt><spanstyle="color:#808080;font-style:italic;">add<spanstyle="color:#808080;background-color:#e2ffe2;font-style:italic;"></tt><spanstyle="color:#808080;font-style:italic;">is<spanstyle="color:#808080;font-style:italic;">*overridden(assumingthespecifiedcollectionisnon-empty).
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。