Java AbstractMap的containsValue()方法实现

Java AbstractMap的containsValue()方法实现,java,dictionary,Java,Dictionary,containsValue在AbstractMap类中实现如下: public boolean containsValue(Object value) { Iterator<Entry<K,V>> i = entrySet().iterator(); if (value==null) { while (i.hasNext()) { Entry<K,V> e = i.next();

containsValue在AbstractMap类中实现如下:

public boolean containsValue(Object value) {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    if (value==null) {
        while (i.hasNext()) {
            Entry<K,V> e = i.next();
            if (e.getValue()==null)
                return true;
        }
    } else {
        while (i.hasNext()) {
            Entry<K,V> e = i.next();
            if (value.equals(e.getValue()))
                return true;
        }
    }
    return false;
}
public boolean containsValue(Object value) {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    while (i.hasNext()) {
        Entry<K,V> e = i.next();
        if (e.getValue().equals(value))
            return true;
    }
    return false;
}
如果实施情况如下:

public boolean containsValue(Object value) {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    if (value==null) {
        while (i.hasNext()) {
            Entry<K,V> e = i.next();
            if (e.getValue()==null)
                return true;
        }
    } else {
        while (i.hasNext()) {
            Entry<K,V> e = i.next();
            if (value.equals(e.getValue()))
                return true;
        }
    }
    return false;
}
public boolean containsValue(Object value) {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    while (i.hasNext()) {
        Entry<K,V> e = i.next();
        if (e.getValue().equals(value))
            return true;
    }
    return false;
}

通过在原始方法中实现特定于null的检查,是否有任何性能改进?

在您建议的实现中,如果e.getValue为null,e.getValue.equalsvalue将抛出NullPointerException,这就是为什么必须使用单独的逻辑来处理null


这不是性能的问题。这是一个正确性问题。

在建议的实现中,如果e.getValue为null,e.getValue.equalsvalue将抛出NullPointerException,这就是为什么必须使用单独的逻辑来处理null


这不是性能的问题。这是一个正确性问题。

Ohh我忘记了Map接受null作为键/值。如果映射不接受空值是否有问题?@PravatPanda如果映射不接受空值,则使用if value==null return false;,启动该方法更有意义;,因为在本例中迭代映射的所有条目没有意义。哦,我忘记了映射接受null作为键/值。如果映射不接受空值是否有问题?@PravatPanda如果映射不接受空值,则使用if value==null return false;,启动该方法更有意义;,因为在本例中迭代映射的所有条目没有意义。Java映射支持null作为值和键。因此e.getValue.equalsvalue可以是e.null.equalsvalue,只需null指针Java映射支持null作为值和键。因此e.getValue.equalsvalue可以是e.null.equalsvalue,即空指针