3 回答

TA貢獻1805條經驗 獲得超10個贊
問題是,byte[]將對象標識用于equals和hashCode,因此
byte[] b1 = {1, 2, 3}
byte[] b2 = {1, 2, 3}
不會與匹配HashMap。我看到三個選擇:
包裝為String,但隨后必須注意編碼問題(您需要確保字節->字符串->字節為您提供相同的字節)。
使用List<Byte>(在內存中可能會很昂貴)。
做自己的包裝類,編寫hashCode并equals使用字節數組的內容。

TA貢獻1828條經驗 獲得超4個贊
只要您只希望鍵的引用相等就可以了-數組不會以您可能想要的方式實現“值相等”。例如:
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(etc)中的鍵之后更改字節數組中的值,則在再次查找鍵時會遇到問題...如果需要,可以在ByteArrayWrapper構造函數中復制數據,但是如果您知道不會更改字節數組的內容,顯然那會浪費性能。
編輯:如評論中所述,您也可以ByteBuffer為此使用(特別是其ByteBuffer#wrap(byte[])方法)??紤]到ByteBuffer您不需要的所有額外功能,我不知道這是否真的正確,但這是一個選擇。

TA貢獻1779條經驗 獲得超6個贊
我們可以為此使用ByteBuffer(這基本上是帶有比較器的byte []包裝器)
HashMap<ByteBuffer, byte[]> kvs = new HashMap<ByteBuffer, byte[]>();
byte[] k1 = new byte[]{1,2 ,3};
byte[] k2 = new byte[]{1,2 ,3};
byte[] val = new byte[]{12,23,43,4};
kvs.put(ByteBuffer.wrap(k1), val);
System.out.println(kvs.containsKey(ByteBuffer.wrap(k2)));
將打印
true
添加回答
舉報