![](/img/trans.png)
[英]java.lang.OutOfMemoryError - new int[Integer.MAX_VALUE];
[英]What does (int & Integer.MAX_VALUE) % int do in Java?
在Java中,我遇到了以下行:
e.g.: (1 & Integer.MAX_VALUE) % 4
e.g.: (2 & Integer.MAX_VALUE) % 5
它有什么作用? 我已經嘗試過代碼,但我無法理解它的用途或功能。 試圖檢查的代碼是什么?
基本上,它是(int & Integer.MAX_VALUE) % int
。
實際代碼(來自Hadoop培訓課程):
public int getPartition(StringPairWritable key, Text value, int numReduceTasks) {
return (key.getLeft().hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
i & Integer.MAX_VALUE
與此代碼的作用相同:
if(i < 0) {
i = (i + Integer.MAX_VALUE + 1);
}
%
是常規余數運算。
如果您不關心它的實際值(例如,如果您想將可以是正數和負數的隨機數轉換為正值),這是確保整數為正的快速方法。
Integer.MAX_VALUE
是0x7FFFFFFF
。 因此num & Integer.MAX_VALUE
清除最高位num
。 % numReduceTasks
是除以numReduceTasks
后的正常余數。
這樣做是為了將有符號數轉換為非負數,然后獲得從0
到numReduceTasks-1
的均勻分布值。 請注意,如果您編寫Math.abs(key.getLeft().hashCode()) % numReduceTasks
,如果hashCode()
恰好是Integer.MIN_VALUE
,則可能會得到負數,因為Math.abs(Integer.MIN_VALUE)
仍然是Integer.MIN_VALUE
。 所以& Integer.MAX_VALUE
是一個更安全的選擇。
這里有兩個部分:
讓我們首先介紹它的Java方面。 它是相當簡單的逐位數學運算,因為它清除符號位並將值轉換為正整數。
這很容易在這里展示; 我們假設我們的密鑰是-128876912,即0xF8517E90
。 int的最大值是0x7FFFFFFF
。
如果我們查看實際的數學運算,符號位將被清除(在這種情況下還有很多其他位),我們得到一個正整數值。
1111 1000 0101 0001 0111 1110 1001 0000
0111 1111 1111 1111 1111 1111 1111 1111
---------------------------------------
0111 1000 0101 0001 0111 1110 1001 0000
如果值為正,則最終結果是我們返回相同的值。
這很重要,因為哈希碼可能會返回負數; 我不相信你想要一個負值,因為一個重要的原因稍后。
對於分區位,這比我真正聲稱的Hadoop知識要多一些,但在閱讀完文檔后 ,它會通知您該值屬於哪個分區。 這就是模數的來源; 你可以保證在[0, partition)
之間得到一個值,從而指定哪個reducer處理特定的數據位。
如果代碼中的表達式確實存在
(i & Integer.MAX_VALUE) % j
它計算i mod j
的殘差類。 注意, i % j
是除法的余數,對稱(wrt i == 0)函數,而殘差類是周期函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.