Карта Java <> с возможными типами? - PullRequest
0 голосов
/ 24 октября 2011

Как это возможно: HashMap<byte[], byte[]> и что такое хеш () байта []?

Ответы [ 2 ]

12 голосов
/ 24 октября 2011

Да, это возможно (с большой оговоркой, см. Ниже), но byte[] не является "внутренним типом".Во-первых, такого нет, вы вероятно имеете в виду «примитивный тип».Второе: byte[] - это , а не - примитивный тип, byte - это.Массив всегда ссылочного типа.

Массивы не имеют конкретных реализаций hashCode, поэтому они будут просто использовать hashCode из Object, что означает, что hashCode будет идентификатором- hashCode, который не зависит от фактического содержания.

Другими словами: byte[] очень плохоMap, потому что вы можете извлечь значение только с точно таким же экземпляром .

Если вам нужен контентный hashCode() на основе массива, вы можете использовать Arrays.hashCode(), но это не поможет вам (напрямую) с Map.Также есть Arrays.equals() для проверки на равенство содержимого.

Вы можете обернуть byte[] в тонкий объект-обертку, который реализует hashCode() и equals()(используя методы, упомянутые выше):

import java.util.Arrays;

public final class ArrayWrapper {
  private final byte[] data;
  private final int hash;

  public ArrayWrapper(final byte[] data) {
    // strictly speaking we should make a defensive copy here,
    // but I *assume* (and should document) that the argument
    // passed in here should not be changed
    this.data = data;
    this.hash = Arrays.hashCode(data);
  }

  @Override
  public int hashCode() {
    return hash
  }

  @Override
  public boolean equals(Object o) {
    if (!(o instanceof ArrayWrapper)) {
      return false;
    }
    ArrayWrapper other = (ArrayWrapper) o;
    return this.hash == other.hash && Arrays.equals(this.data, other.data);
  }
  // don't add getData to prevent having to do a defensive copy of data
}

Используя этот класс, вы можете использовать Map<ArrayWrapper,byte[]>.

2 голосов
/ 24 октября 2011

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

byte[] a = { 2, 3 };
byte[] b = { 2, 3 };
System.out.println(a.equals(b)); // false
Map<byte[], String> map = new HashMap<byte[], String>();
map.put(a, "A");
map.put(b, "B");
System.out.println(map); // {[B@37d2068d=B, [B@7ecec0c5=A}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...