Intereting Posts
Wiki о android-zoom-view.jar Как определить, когда устройство ориентировано вверх дном в libGDX UnsupportedOperationException на Android 3.2 при выборе текста (AppCompat 21.0.3) Как скрыть сообщения NativeCrypto из Logcat Декодирование и рендеринг видео на Android Установка центра тяжести детского вида Изменение макета выравнивания другого дочернего вида в горизонтальной компоновке? Изменить приоритет собственного потока на Android в c / c ++ Получить данные из диалога фрагментов – лучшие практики? «Ошибка клиентской версии командной строки Subversion слишком старая» в Android Studio Сжатие изображения для Android без полной загрузки в память Android – onAttach (Контекст), не вызываемый API 23 Android – Как программно установить стиль кнопки в Linearlayout? Добавьте верхний / нижний колонтитул в список в xml Есть ли способ определить, круглые ли часы? OutOfMemoryException при расшифровке файла с помощью маскировки facebook

HashMap с байтовым массивом и значением String – containsKey () не работает

Я использую ключ HashMap: byte [] и значение String. Но я понимаю, что даже я помещаю один и тот же объект (тот же массив байтов и одно и то же строковое значение), используя

myList.put(TheSameByteArray, TheSameStringValue) 

В HashMap таблица по-прежнему вставляет новый объект с другим HashMapEntry. Тогда функция containsKey () не может работать.

Может ли кто-то объяснить это мне? Как я могу это исправить? Благодарю. (Android Java)

 @Override public boolean containsKey(Object key) { if (key == null) { return entryForNullKey != null; } int hash = Collections.secondaryHash(key); HashMapEntry<K, V>[] tab = table; for (HashMapEntry<K, V> e = tab[hash & (tab.length - 1)]; e != null; e = e.next) { K eKey = e.key; if (eKey == key || (e.hash == hash && key.equals(eKey))) { return true; } } return false; } 

byte[] (или любой массив) не может работать должным образом в качестве ключа в HashMap , поскольку массивы не переопределяют equals , поэтому два массива будут считаться равными, только если они относятся к одному и тому же объекту.

Вам придется обернуть свой byte[] в каком-то специальном классе, который переопределяет hashCode и equals и использует этот пользовательский класс в качестве ключа к вашему HashMap.

Добавляя к ясному ответу Эран: Поскольку byte [] или любой массив не переопределяют hashcode и equals (он использует методы по умолчанию класса Object), вы всегда можете обернуть вокруг String Object, который принимает byte [] как аргумент конструктора. Не только String Формировать хорошие ключи в Карте, они тоже неизменяемы (операции на карте на основе Хэш быстрее)

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String (байт [])

ПРИМЕЧАНИЕ. Это чрезвычайно сложный способ создания массива или строки, ключа в HashMap, без переопределения методов equals () или hashCode (). Я включу ответ в общий способ, чтобы читатели могли получить идею и реализовать в соответствии с их требованиями.

Скажем, у меня есть два числа, n и r . Я хочу получить пару ключ-значение с [n,r] в качестве ключа и (n+r) в качестве значения.

 Map<List<Integer>, Integer> map = new HashMap<List<Integer>, Integer>(); List<Integer> key = Arrays.asList(n, r); if( map.containsKey(key) ) return map.get(key); 

Что делать, если на карте не было ключа?

 map.put(Collections.unmodifiableList(Arrays.asList(n, r)), (n+r)); 

unmodifiable часть (без какой-либо дополнительной глубины) гарантирует, что ключ не может изменить хэш-код.

Теперь map.containsKey(key) будет true.

Примечание. Это не очень хороший способ сделать это. Это просто обходной путь.