Вы также можете использовать IdentityHashMap
в качестве карты общего назначения , если , вы можете убедиться, что объекты, которые вы используете в качестве ключей, будут равны тогда и только тогда, когда их ссылки равны.
В какую выгоду? Очевидно, что это будет быстрее и будет использовать меньше памяти, чем при использовании реализаций, таких как HashMap
или TreeMap
.
На самом деле, есть много случаев, когда это стоит. Например:
Enum
s. Хотя для перечислений есть даже лучшая альтернатива: EnumMap
Class
объектов. Они также сравнимы по ссылке.
- Стажировка
String
с. Либо указав их как литералы , либо позвонив им String.intern()
.
- Кэшированные экземпляры. Некоторые классы обеспечивают кэширование своих экземпляров. Например, цитата из Javadoc
Integer.valueOf(int)
:
Этот метод всегда будет кэшировать значения в диапазоне от -128 до 127 включительно ...
- Некоторые библиотеки / фреймворки будут управлять только одним экземпляром типов Ceratin, например Spring bean.
- Синглтон-типы. Если вы используете экземпляры типов, построенных по шаблону Singleton , вы также можете быть уверены, что (не более) один экземпляр существует из них, и, следовательно, эталонный тест на равенство будет соответствовать тесту на равенство.
- Любой другой тип, в котором вы явно позаботились об использовании только тех же ссылок для доступа к значениям, которые использовались для помещения значений в карту.
Для демонстрации последней точки:
Map<Object, String> m = new IdentityHashMap<>();
// Any keys, we keep their references
Object[] keys = { "strkey", new Object(), new Integer(1234567) };
for (int i = 0; i < keys.length; i++)
m.put(keys[i], "Key #" + i);
// We query values from map by the same references:
for (Object key : keys)
System.out.println(key + ": " + m.get(key));
Вывод будет, как и ожидалось (поскольку мы использовали те же самые Object
ссылки на значения запроса с карты):
strkey: Key #0
java.lang.Object@1c29bfd: Key #1
1234567: Key #2