• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:HashMapvaluesaddAll异常

java 搞代码 3年前 (2022-01-27) 34次浏览 已收录 0个评论

问题:在应用一个Collection.addAll()办法时报告UnsupportedOperationException。追溯起因发现该collection是来自于hashMap.values()。

剖析起因:通过查看源代码,发现hashMap.values()实现如下:

//HashMap.java
public Collection<V> values() {

    Collection<V> vs = values;
    return (vs != null ? vs : (values = new Values()));
}

  private final class Values extends AbstractCollection<V> {
    public Iterator<V> iterator() {
        return newValueIterator();
    }
    public int size() {
        return size;
    }
    public boolean contains(Object o) {
        return containsValue(o);
    }
    public void clear() {
        HashMap.this.clear();
    }
}

//其中values的定义如下:AbstractMap.java
  transient volatile Collection<V> values = null;
   public Collection<V> values(<div style="color:transparent">来源gaodai.ma#com搞#代!码网</div>) {
    if (values == null) {
        values = new AbstractCollection<V>() {
            public Iterator<V> iterator() {
                return new Iterator<V>() {
                    private Iterator<Entry<K,V>> i = entrySet().iterator();

                    public boolean hasNext() {
                        return i.hasNext();
                    }

                    public V next() {
                        return i.next().getValue();
                    }

                    public void remove() {
                        i.remove();
                    }
                };
            }

            public int size() {
                return AbstractMap.this.size();
            }

            public boolean isEmpty() {
                return AbstractMap.this.isEmpty();
            }

            public void clear() {
                AbstractMap.this.clear();
            }

            public boolean contains(Object v) {
                return AbstractMap.this.containsValue(v);
            }
        };
    }
    return values;
}

从下面代码看到,hashMap.values()先看values是否为空:

如果不为空,则间接返回values。values是在在AbstractMap中定义的,初始化时new了一个AbstractCollection,并实现了若干办法,然而并没有实现all()和addAll()办法。

如果为空,则new一个外部实现类Values。Values同样没有实现AbstractCollection的没有实现all()和addAll()办法。

再来看一下AbstractCollection的add()和addAll()办法:

//AbstractCollection.java
public boolean add(E e) {

    throw new UnsupportedOperationException();
}

public boolean addAll(Collection<? extends E> c) {

    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

能够看到,add办法的实现是间接抛出UnsupportedOperationException,addAll办法调用add办法,也间接抛出异样,同样的,HashMap.values()调用add()和addAll()也会抛出异样。

论断:通过以上剖析,明确了HashMap.values()调用add()和addAll()抛出异样的起因。也通知咱们在理论应用中,要留神防止间接应用HashMap.values().add()和HashMap.values().addAll()。
另外:HashMap.vKeySet(),HashMap.entrySet()调用add()和addAll()办法也是如此。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:HashMapvaluesaddAll异常

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址