首頁  >  文章  >  使用位元組數組作為 Map 鍵

使用位元組數組作為 Map 鍵

王林
王林轉載
2024-02-08 23:51:301062瀏覽

在PHP中,使用位元組陣列作為Map鍵是一種高效率的方法,可以提高程式的效能和記憶體利用率。位元組數組作為鍵,相比於字串作為鍵,具有更快的存取速度和更少的記憶體消耗。透過使用位元組數組作為鍵,可以有效地節省記憶體空間,特別是在處理大量資料時。此外,位元組數組還可以提供更靈活的鍵名操作,如比較大小、截取和拼接等。總而言之,使用位元組數組作為Map鍵是PHP開發的一個有益技巧,可以提升程式的效能和效率。

問題內容

您發現使用位元組陣列作為 Map 鍵有什麼問題嗎?我還可以透過 String 執行 new String(byte[]) 和哈希,但使用 byte[] 更直接。

解決方法

問題在於 byte[]equalshashcode 使用物件標識,因此

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

hashmap 中不符合。我看到三個選項:

  1. 包裝在 string 中,但是您必須小心編碼問題(您需要確保 byte -> string -> byte 為您提供相同的位元組)。
  2. 使用 listdf12804343f5520ff3af5d9f86b34817 (記憶體消耗較大)。
  3. 寫自己的包裝類,寫 hashcodeequals 來使用位元組數組的內容。

只要您只想鍵的引用相等,就可以了 - 數組不會以您可能想要的方式實現“值相等”。例如:

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[]) 方法) 。我不知道這是否真的是正確的事情,因為 bytebuffers 擁有您不需要的所有額外功能,但它是一個選項。

以上是使用位元組數組作為 Map 鍵的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除