среда, 21 ноября 2007 г.

Java Puzzle 62: The Name Game

Что напечатает следующая программа и почему?
Map map = new IdentityHashMap();
map.put("Mickey", "Mouse");
map.put("Mickey", "Mantle");
System.out.println(map.size());

Напечатает 1, но почему? IdentityHashMap в отличии от HashMap сравнивает объекты по равенству указателей, не вызывая метода equals, а по спецификации (JLS 15.28) два строковых литерала равны не только по значению, но и по ссылке (interned). Однако, следующая программа покажет возможную проблему:
StringBuilder sb = new StringBuilder("Mickey");
map.put(sb.toString(), "Mouse");
map.put(sb.toString(), "Mantle");
System.out.println(map.size());

Используйте IdentityHashMap очень осторожно, так как этот класс не является имплементацией общего назначения интерфейса Map.

Комментариев нет:

Отправить комментарий