0

对象在 Java 中相当容易理解。对象被构造,在堆中分配空间,你将它分配给指向它的变量名(引用)。没什么大不了。但是原始类型是如何表示的呢?它们位于哪里(堆栈或堆)?

当我想知道该Integer.toString(int)方法可能是什么样子时,我想到了这个问题。它无法解析文本,因为......它不是文本。它不能toString()显式或隐式调用方法,因为这既是循环逻辑,也是公然无视原始类型不能分配给它们的方法(因为它们不是对象)这一事实。我认为该方法在逻辑上可能对and之间的所有可能值有大量if/else条件,但这似乎也比它应该的复杂得多。intInteger.MIN_VALUEInteger.MAX_VALUE

那么这是如何工作的呢?

4

3 回答 3

5

但是原始类型是如何表示的呢?

原始类型的实例在内存中表示为位模式。例如,anint表示为 32 位(4 个字节,1 个 32 位字)。

它们位于哪里(堆栈或堆)?

任何一个。这取决于您将原始值保存在哪种变量中。

我想知道 Integer.toString(int) 方法可能是什么样子。

该方法的核心是一个简单的算法是一个循环重复

  1. 通过取余数 10 取最后一位小数,并且
  2. 将数字除以 10。

就像手动将二进制数转换为十进制一样。

(有关详细信息,请查看源代码。每个 Sun / Oracle JDK 都包含核心库的源代码。或者,您可以通过 Google 搜索在 Internet 上轻松找到源代码(各种版本)。)

于 2012-09-22T03:45:44.973 回答
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];

     }
于 2012-09-22T03:45:34.827 回答
1

方法是使用Java 字节码实现的。查看此参考资料,了解如何使用字节码实现一个简单的方法。通常,解释器即时编译器 (JIT) 会执行这些字节码。

本质上,有一个堆栈可以包含对象引用或原始类型。字节码允许您对堆栈上的项目进行操作(添加其中两个,或调用一个方法等)。

于 2012-09-22T03:46:32.057 回答