Поддержание набора отдельных объектов в Java

#java #set #identity #equality

#java #набор #идентификация #равенство

Вопрос:

Я пытаюсь реализовать Map в среде с очень ограниченным объемом памяти. Я ожидаю, что тип значения map будет иметь много дубликатов (т. Е. Не только то, что существует много x и y таких, что x.равно (y), но и много x и y таких, что x == y). Поэтому я хотел бы сохранить эти указатели в небольшом массиве (в обычном случае, менее нескольких десятков записей) и проиндексировать его, используя целое число, которое раздувается из массива байтов; обычно это приводит к существенной экономии.

Однако для этого требуется какой-либо способ отслеживания отдельных ссылок. Я мог бы просто отслеживать их все в некотором списке и выполнять линейный поиск по нему каждый раз, когда добавляется новое значение, но тогда карта не будет масштабироваться более чем до нескольких сотен различных значений (и, хотя множество различных значений встречается редко, это не невозможно). Для реализации такого типа карты внутреннему классу Java должно быть легко, поскольку ему просто нужно выполнять сравнения указателей, но этот интерфейс, похоже, не предоставляется (фактически, поскольку метод Object hashCode по умолчанию просто возвращает базовый указатель в большинстве реализаций, я нахожусь в ироничном положении разработчика карты, пострадавшего от пользователей, реализующих hashCode).

Есть ли какой-либо способ добиться такого поведения?

Ответ №1:

Вы ищете оператор java.lang.System.identityHashCode(Object) and == ?

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

1. Например, IdentityHashMap

Ответ №2:

В качестве альтернативы вы можете рассмотреть следующее:

Если у вас есть карта, на которой у вас много дублированных значений (где entry1.getValue() == entry2.getValue() ), то вы можете использовать свои текущие значения в качестве ключа, а текущие ключи, которые указывают на тот же объект в памяти, в качестве списка элементов.

 Map<SomeType1, List<SomeType2> map = new IdentityHashMap<SomeType1, List<SIneType2>>();