亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用字節數組作為Map鍵

使用字節數組作為Map鍵

牛魔王的故事 2019-12-03 09:51:07
使用字節數組作為Map鍵,您是否看到任何問題?我也可以這樣做new String(byte[]),String但使用起來更簡單byte[]。
查看完整描述

3 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

問題是,byte[]將對象標識用于equals和hashCode,因此


byte[] b1 = {1, 2, 3}

byte[] b2 = {1, 2, 3}

不會與匹配HashMap。我看到三個選擇:


包裝為String,但隨后必須注意編碼問題(您需要確保字節->字符串->字節為您提供相同的字節)。

使用List<Byte>(在內存中可能會很昂貴)。

做自己的包裝類,編寫hashCode并equals使用字節數組的內容。


查看完整回答
反對 回復 2019-12-03
?
明月笑刀無情

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您不需要的所有額外功能,我不知道這是否真的正確,但這是一個選擇。


查看完整回答
反對 回復 2019-12-03
?
哆啦的時光機

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


查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 539 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號