Java 独立于实现的查看映射是否包含空键的方法

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,因

我有一个API,它接收一个实现
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);
}