原始类型如何在系统中表示? (以Integer.toString(int)为例)

时间:2012-09-22 03:39:56

标签: java primitive

Java中的对象相当容易理解。构造对象,在堆中分配空间,并将其分配给指向它的变量名(引用)。没什么大不了。但原始类型如何代表?它们位于何处(堆叠或堆积)?

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

那么这是如何运作的?

3 个答案:

答案 0 :(得分:5)

  

但原始类型是如何表现的?

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

  

它们位于何处(堆叠或堆积)?

要么。它取决于您保存原始值的变量类型。

  

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

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

  1. 取最后一位十进制数字,取数字余数为10,
  2. 将数字除以10。
  3. 就像你手动将二进制数转换为十进制一样。

    (有关详细信息,请查看源代码。每个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实施方法。查看此参考以了解如何使用字节码实现简单方法。通常,interpreterJust-in-time compiler (JIT)执行这些字节码。

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