Да, это возможно (с большой оговоркой, см. Ниже), но 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[]>
.