代码之家  ›  专栏  ›  技术社区  ›  asteri

基元类型在系统中是如何表示的?(例如Integer.toString(int))

  •  0
  • asteri  · 技术社区  · 12 年前

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

    当我想知道 Integer.toString(int) 方法可能看起来像。它无法解析文本,因为。。。它不是文本。它不能调用 toString() 方法,因为这既是循环逻辑,也是公然无视原始类型不能为其分配方法这一事实(因为它们不是对象)。我想,从逻辑上讲,这种方法可能有大量的 if/else 一切可能的条件 int 值介于 Integer.MIN_VALUE Integer.MAX_VALUE ,但这似乎也比应该的要复杂得多。

    那么这是怎么回事呢?

    3 回复  |  直到 12 年前
        1
  •  5
  •   Stephen C    12 年前

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

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

    它们位于何处(堆栈或堆)?

    任何一个这取决于原始值所在的变量类型。

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

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

    1. 通过取余数10取最后一个十进制数字,以及
    2. 把数字除以10。

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

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

        2
  •  1
  •   Mark Elliot    12 年前

    没必要怀疑什么 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];
    
         }
    
        3
  •  1
  •   Keith Randall    12 年前

    方法使用实现 Java bytecode 。查看此参考,了解如何使用字节码实现简单方法。通常是 interpreter 或者 Just-in-time compiler (JIT) 执行那些字节码。

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