gpt4 book ai didi

java - 为什么Hashtable的equals方法要测试value是否为null的情况

转载 作者:行者123 更新时间:2023-12-01 14:18:52 25 4
gpt4 key购买 nike

我正在阅读Hashtable的代码,了解到Hashtable的key和value都不能为null,但是它的equals方法测试了value是否为null的情况。

public synchronized boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Map))
return false;
Map<K,V> t = (Map<K,V>) o;
if (t.size() != size())
return false;

try {
Iterator<Map.Entry<K,V>> i = entrySet().iterator();
while (i.hasNext()) {
Map.Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
if (value == null) { // Can Hashtable's value be null?
if (!(t.get(key)==null && t.containsKey(key)))
return false;
} else {
if (!value.equals(t.get(key)))
return false;
}
}
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}

return true;
}

最佳答案

这是一种在处理 NPE 时始终遵循的模式。考虑一个简单的类

public class HelloWorld {
String data;
}

如果生成 hashCode() 和 equals(),您将看到遵循的一般模式。正如本例

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

HelloWorld that = (HelloWorld) o;

if (data != null ? !data.equals(that.data) : that.data != null) return false;

return true;
}

@Override
public int hashCode() {
return data != null ? data.hashCode() : 0;
}

如您所见,我们总是检查 null。这不是强制性的,而是一种良好的编程实践。我知道这对于 Hashtable 来说是没有意义的,但正如我之前提到的,开发人员必须添加此检查以保持统一的模式。

更新:正如 Tim 所建议的由于 Hashtable 是可子类化的,因此子类可能会尝试支持 null 键或值。因此进行空检查是安全的。

关于java - 为什么Hashtable的equals方法要测试value是否为null的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17828718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com