在PHP中,使用位元組陣列作為Map鍵是一種高效率的方法,可以提高程式的效能和記憶體利用率。位元組數組作為鍵,相比於字串作為鍵,具有更快的存取速度和更少的記憶體消耗。透過使用位元組數組作為鍵,可以有效地節省記憶體空間,特別是在處理大量資料時。此外,位元組數組還可以提供更靈活的鍵名操作,如比較大小、截取和拼接等。總而言之,使用位元組數組作為Map鍵是PHP開發的一個有益技巧,可以提升程式的效能和效率。
您發現使用位元組陣列作為 Map 鍵有什麼問題嗎?我還可以透過 String
執行 new String(byte[])
和哈希,但使用 byte[]
更直接。
問題在於 byte[]
對 equals
和 hashcode
使用物件標識,因此
byte[] b1 = {1, 2, 3} byte[] b2 = {1, 2, 3}
在 hashmap
中不符合。我看到三個選項:
string
中,但是您必須小心編碼問題(您需要確保 byte -> string -> byte 為您提供相同的位元組)。 list<byte>
(記憶體消耗較大)。 hashcode
和 equals
來使用位元組數組的內容。 只要您只想鍵的引用相等,就可以了 - 數組不會以您可能想要的方式實現“值相等”。例如:
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[])
方法) 。我不知道這是否真的是正確的事情,因為 bytebuffer
s 擁有您不需要的所有額外功能,但它是一個選項。
以上是使用位元組數組作為 Map 鍵的詳細內容。更多資訊請關注PHP中文網其他相關文章!