Это нормально, если вы хотите ссылочное равенство только для своего ключа - массивы не реализуют "равенство значений" так, как вам бы этого хотелось. Например:
byte[] array1 = new byte[1];
byte[] array2 = new byte[1];
System.out.println(array1.equals(array2));
System.out.println(array1.hashCode());
System.out.println(array2.hashCode());
печатает что-то вроде:
false
1671711
11394033
(Фактические цифры не имеют значения; важен тот факт, что они разные.)
Предполагая, что вы на самом деле хотите равенства, я предлагаю вам создать собственную оболочку, которая содержит byte[]
и соответствующим образом реализует равенство и генерацию хеш-кода:
public final class ByteArrayWrapper
{
private final byte[] data;
public ByteArrayWrapper(byte[] data)
{
if (data == null)
{
throw new NullPointerException();
}
this.data = data;
}
@Override
public boolean equals(Object other)
{
if (!(other instanceof ByteArrayWrapper))
{
return false;
}
return Arrays.equals(data, ((ByteArrayWrapper)other).data);
}
@Override
public int hashCode()
{
return Arrays.hashCode(data);
}
}
Обратите внимание, что если вы измените значения в байтовом массиве после использования ByteArrayWrapper
, в качестве ключа в HashMap
(и т. Д.) У вас будут проблемы с поиском ключа снова ... вы можете взять копию данных в конструкторе ByteArrayWrapper
, если хотите, но очевидно, что это будет пустой тратой производительности, если вы знаете, что не будет изменять содержимое байтового массива.
РЕДАКТИРОВАТЬ: Как уже упоминалось в комментариях, вы также можете использовать ByteBuffer
для этого (в частности, его ByteBuffer#wrap(byte[])
метод). Я не знаю, действительно ли это правильно, учитывая все дополнительные способности, которые есть у ByteBuffer
, которые вам не нужны, но это вариант.