Java 独立于实现的查看映射是否包含空键的方法
我有一个API,它接收一个实现Java 独立于实现的查看映射是否包含空键的方法,java,collections,null,hashmap,concurrenthashmap,Java,Collections,Null,Hashmap,Concurrenthashmap,我有一个API,它接收一个实现Map接口的参数。我需要检查此映射是否包含任何null键。问题在于Map的某些实现,例如ConcurrentHashMap,如果调用contains(null),就会抛出NPE 用什么好的、独立于实现的方法来查看遵循Map接口的对象是否包含null键 请注意,我不能使用keySet并检查它是否包含空值,因为ConcurrentHashMap实际上只是将keySet包装到自身上,并在下面再次调用contains 任何想法都将不胜感激。我不想使用instanceOf,因
Map
接口的参数。我需要检查此映射是否包含任何null
键。问题在于Map
的某些实现,例如ConcurrentHashMap
,如果调用contains(null)
,就会抛出NPE
用什么好的、独立于实现的方法来查看遵循Map
接口的对象是否包含null
键
请注意,我不能使用keySet
并检查它是否包含空值,因为ConcurrentHashMap
实际上只是将keySet
包装到自身上,并在下面再次调用contains
任何想法都将不胜感激。我不想使用instanceOf
,因为当你需要处理这么多不同类型的映射时,这看起来很难看,我认为这样做可以:
new HashSet<K>(map.keySet()).contains(null);
private static Map<String, String> m = new ConcurrentHashMap<>();
public static void main(String[] args) {
boolean hasNullKey = false;
try {
if (m != null && m.containsKey(null)) {
hasNullKey = true;
}
} catch (NullPointerException npe) {
// Relies on the fact that you can't add null keys to Map
// implementations that will throw when you check for one.
// Add logging etc.
}
System.out.println("Does map have null key? " + hasNullKey);
}
private static Map m=new ConcurrentHashMap();
公共静态void main(字符串[]args){
布尔hasNullKey=false;
试一试{
如果(m!=null&&m.containsKey(null)){
hasNullKey=true;
}
}捕获(NullPointerException npe){
//依赖于不能向映射添加空键这一事实
//检查时将抛出的实现。
//添加日志记录等。
}
System.out.println(“映射是否有空键?”+hasNullKey);
}
我很惊讶没有收藏#isAllowNull()
之类的,但显然没有。是的,那些迫使你使用try/catch来测试它们的能力和状态的API。我真的很讨厌捕捉这样的NPE。我会再等一段时间,看看是否有更好的替代方案,然后再接受它。@AbuZubair我同意,正如Kevin所说,一个好的API方法会更好,但我们在这里处理的是一个接口,所以如果没有具体的实现细节,就不会想到什么。如果ConcurrentHashMap
等在containsKey
中查找空值并返回false,那就太好了。这当然会奏效,但会增加创建新HashSet
的开销。是的,我非常喜欢这一点,但我不能接受依赖于键集的新HashSet
@pbabcdefp的性能实现时,您现在可能比我的解决方案有一个迭代开销。如果键集是一个HashSet
,那么您的实现是O(n/2)而不是O(1)。我同意。我认为这三种解决方案都是荒谬的。你被迫做这些事情的事实是荒谬的。为什么map.containsKey(null)
抛出NPE?!这是一个很大的疏忽。接口的全部要点是,您应该能够使用不同的实现。作为记录,如果我是OP,我将接受您的答案。如果实现不允许null
,它将避免迭代,如果允许,则使用最快的解决方案(containsKey()
)。你不会比这更好的。
private static Map<String, String> m = new ConcurrentHashMap<>();
public static void main(String[] args) {
boolean hasNullKey = false;
try {
if (m != null && m.containsKey(null)) {
hasNullKey = true;
}
} catch (NullPointerException npe) {
// Relies on the fact that you can't add null keys to Map
// implementations that will throw when you check for one.
// Add logging etc.
}
System.out.println("Does map have null key? " + hasNullKey);
}