[英]How are primitive types represented in the system? (Integer.toString(int) as example)
對象在Java中相當容易理解。 該對象已構造好,並在堆中分配了空間,然后將其分配給指向該對象的變量名(引用)。 沒什么大不了。 但是原始類型如何表示? 它們位於何處(堆棧或堆)?
當我想知道Integer.toString(int)
方法的外觀時,我想到了這個問題。 它無法解析文本,因為...不是文本。 它不能顯式或隱式調用toString()
方法,因為這既是循環邏輯又是公然忽略原始類型不能為其分配方法的事實(因為它們不是對象)。 我認為該方法在邏輯上可能為Integer.MIN_VALUE
和Integer.MAX_VALUE
之間的所有可能的int
值提供大量的if/else
條件,但這似乎比應有的復雜得多。
那么這是如何工作的呢?
但是原始類型如何表示?
基本類型的實例以內存中的位模式表示。 因此,例如,一個int
表示為32位(4字節,1個32位字)。
它們位於何處(堆棧或堆)?
要么 這取決於您持有原始值的變量類型。
我想知道Integer.toString(int)方法是什么樣的。
該方法的核心是一個簡單的算法,是反復循環的
就像您要手動將二進制數字轉換為十進制一樣。
(有關詳細信息,請查看源代碼。每個Sun / Oracle JDK都包含核心庫的源代碼。或者,您可以使用Google搜索輕松地在Internet上找到源代碼(各種版本)。)
無需懷疑Integer.toString(int)
是什么樣子(鏈接顯示了Java 6的OpenJDK實現),它使用了一個包私有幫助程序函數getChars
,該函數簡單地將以10為底的數字的每個數字都分開了。
這是代碼的症結所在(從354行開始)
// Generate two digits per iteration
while (i >= 65536) {
q = i / 100;
// really: r = i - (q * 100);
r = i - ((q << 6) + (q << 5) + (q << 2));
i = q;
buf [--charPos] = DigitOnes[r];
buf [--charPos] = DigitTens[r];
}
方法是使用Java字節碼實現的。 查看此參考資料以了解如何使用字節碼實現簡單的方法。 通常, 解釋器或即時編譯器(JIT)都會執行這些字節碼。
本質上,這里有一個堆棧,可以包含對象引用或原始類型。 字節碼使您可以對堆棧中的項目執行操作(將它們加起來兩個,或在一個上調用一個方法,依此類推)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.