[英]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.