开发者社区> 问答> 正文

HashSet源码问题?报错

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();  }


展开
收起
爱吃鱼的程序员 2020-06-10 13:29:21 558 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    注意此时调用的是方法add,这里实现了多态,调用的是具体实现类里的add方法,也就是你hashset的实现的add方法

    PleaseAdd


    引用代码的正确姿势如下,你用的是常规引用,显示有问题。<preclass="brush:java;toolbar:true;auto-links:false;">publicbooleanaddAll(Collection<?extendsE>c){booleanmodified=false;Iterator<?extendsE>e=c.iterator();while(e.hasNext()){if(add(e.next()))modified=true;}returnmodified;}

    <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).

    2020-06-10 13:29:36
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载