在java的源代码中可以看到HashSet的add是调用的HashMap的put方法其中K为add的对象为V一个常量
再来分析下面得put方法public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
其中的if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
是不是就是进行重复检查?
如果是那iterator好像没有用到啊?

解决方案 »

  1.   

    网上N多的答案都是iterator
      

  2.   

    没看到动态不发表评论。
    iterator只是一个迭代器罢了。
      

  3.   

    由于equals方法和hashCode方法在对象中可能会被重写 从而带来不可预期的影响 所以:
    if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  可能会在判定对象时可能会出现判定错误,在无法确定set的元素是否重复时,用iterator迭代每个元素进行判定,已确定是否有重复数据. 
      

  4.   

    iterator  是用来迭代元素的 不是用来判重的
      

  5.   

    iterator 是用来统一遍历集体的迭代器而已!!!if (e.hash == hash && ((k = e.key) == key || key.equals(k)))   是用来判定set元素中是否重复,Java中判定两个对象是否相等,是根据它们的哈希方法,还有equals方法来判定的!这跟iterator没关系!
      

  6.   

    iterator 仅仅是迭代器。要搞清楚啊lz
      

  7.   

    set是无序的,如果有重复元素,怎么区分谁是谁?
      

  8.   


    可能我的问题没描述清楚。Set是不能重复的,这个我知道啊。但是HashSet是通过什么来判断
    元素重复的呢?网上有说是iterator但是我看了源代码 根本就没有用到
    它啊。。所以问下 是不是网上说的不对还是 我看代码 看错了