3 回答

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

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
只要您只希望鍵的引用相等就可以了-數(shù)組不會(huì)以您可能想要的方式實(shí)現(xiàn)“值相等”。例如:
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());
打印類(lèi)似:
false
1671711
11394033
(實(shí)際數(shù)字無(wú)關(guān)緊要;它們不同的事實(shí)很重要。)
假設(shè)您實(shí)際上想要平等,我建議您創(chuàng)建自己的包裝器,其中包含byte[]并適當(dāng)?shù)貙?shí)現(xiàn)平等和哈希碼生成:
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);
}
}
請(qǐng)注意,如果您在使用ByteArrayWrapper,作為HashMap(etc)中的鍵之后更改字節(jié)數(shù)組中的值,則在再次查找鍵時(shí)會(huì)遇到問(wèn)題...如果需要,可以在ByteArrayWrapper構(gòu)造函數(shù)中復(fù)制數(shù)據(jù),但是如果您知道不會(huì)更改字節(jié)數(shù)組的內(nèi)容,顯然那會(huì)浪費(fèi)性能。
編輯:如評(píng)論中所述,您也可以ByteBuffer為此使用(特別是其ByteBuffer#wrap(byte[])方法)??紤]到ByteBuffer您不需要的所有額外功能,我不知道這是否真的正確,但這是一個(gè)選擇。

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
我們可以為此使用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
添加回答
舉報(bào)