2013-05-06 2 views
3

Мне интересно, имеет ли смысл проверять конкретный ключ, прежде чем пытаться получить к нему доступ. Пример:Действительно ли Map.containsKey() полезен?

Map myMap .... 
if myMap.containsKey(key) { 
    Object value = myMap.get(key); 
    ..... 
} 

Пример не используется containsKey:

Object value = myMap.get(key); 
if (value != null) { 
...... 
} 

EDIT: уточнить на нулевых ключей и значений. Предположим, что карта не допускает нулевые ключи и нулевые значения, поэтому эти два примера идентичны.

+0

Дублированный: [http://stackoverflow.com/q/14601016/1073063](http://stackoverflow.com/q/14601016/1073063) – Pablo

+0

Это дубликат ** и ** [не подходит для SO] (http://stackoverflow.com/faq#dontask). –

+0

@dhblah ваше редактирование делает ваш вопрос совершенно другим вопросом. – Uooo

ответ

14

Да - клавиши могут иметь null значения:

Map myMap = ...; 
myMap.put("foo", null); 
if (myMap.containsKey("foo")) { 
    Object value = myMap.get(key); // value is null 
} 

Object value = myMap.get("foo"); 
if (value != null) { 
    // you won't get here 
} 

Можно утверждать (и я согласен), что не различая значение null от несуществующей записи было довольно плохое дизайнерское решение, когда они первый сделанный API коллекции Java.

(Некоторые карты - Hashtable и ConcurrentHashMap, по крайней мере, - не позволяют null значения, что делает containsKey менее важными, но это все-таки хорошее улучшение читаемости над m.get(k) == null.)

5

В случае, если ваша карта позволяет null, только с get(key) вы не можете различать пару ключей/значений, которая имеет значение = null и «нет пары ключей/значений».

1

Да, это полезно - особенно, если ваша карта позволяет null значения ...

@Test 
public void testContainsKey() { 
    Map<String, Object> strObjMap = new HashMap<String, Object>(); 
    strObjMap.put("null", null); 

    assertTrue(strObjMap.containsKey("null")); 
    assertNull(strObjMap.get("null")); 
}