第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用字節(jié)數(shù)組作為Map鍵

使用字節(jié)數(shù)組作為Map鍵

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

3 回答

?
holdtom

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)容。


查看完整回答
反對(duì) 回復(fù) 2019-12-03
?
明月笑刀無(wú)情

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è)選擇。


查看完整回答
反對(duì) 回復(fù) 2019-12-03
?
哆啦的時(shí)光機(jī)

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


查看完整回答
反對(duì) 回復(fù) 2019-12-03
  • 3 回答
  • 0 關(guān)注
  • 531 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)