Java中的对象相当容易理解。构造对象,在堆中分配空间,并将其分配给指向它的变量名(引用)。没什么大不了。但原始类型如何代表?它们位于何处(堆叠或堆积)?
当我想知道Integer.toString(int)
方法的样子时,我想到了这个问题。它无法解析文本,因为......它不是文本。它不能显式地或隐式地调用toString()
方法,因为这既是循环逻辑又是对原始类型不能分配给它们的方法(因为它们不是对象)这一事实的公然忽视。我认为这个方法在逻辑上有可能为if/else
和int
之间的所有可能Integer.MIN_VALUE
值设置大量Integer.MAX_VALUE
条件,但这似乎也比它复杂得多应该是。
那么这是如何运作的?
答案 0 :(得分:5)
但原始类型是如何表现的?
原始类型的实例在内存中表示为位模式。例如,int
表示为32位(4个字节,1个32位字)。
它们位于何处(堆叠或堆积)?
要么。它取决于您保存原始值的变量类型。
我想知道Integer.toString(int)方法可能是什么样的。
该方法的核心是一个简单的算法,是一个重复的循环
就像你手动将二进制数转换为十进制一样。
(有关详细信息,请查看源代码。每个Sun / Oracle JDK都包含核心库的源代码。或者,您可以通过Google搜索轻松找到Internet上的源代码(各种版本)。)< / p>
答案 1 :(得分:1)
无需想知道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];
}
答案 2 :(得分:1)
使用Java bytecode实施方法。查看此参考以了解如何使用字节码实现简单方法。通常,interpreter或Just-in-time compiler (JIT)执行这些字节码。
本质上,有一个堆栈可以包含对象引用或基本类型。字节码允许您对堆栈上的项目执行操作(添加其中两个,或在一个上调用方法等)。