Integer.toString()如何在内部工作?

时间:2014-08-26 12:21:51

标签: java integer tostring

我在此之前发现了类似的问题:how does Float.toString() and Integer.toString() works?

但这并没有谈到该功能如何在内部运作。当我打开Integer.toString()的内部源代码时,对普通的初级java程序员来说这是不可理解的。

有人可以解释一下内部的简短说明吗?


注意:这是我最近被问到的面试问题之一。我不知道如何回答这个问题!

1 个答案:

答案 0 :(得分:6)

integer.toString()的无参数调用只是调用静态方法Integer.toString(int i)(使用integer变量自身的原始值),其实现如下;

  public static String toString(int i) {
       if (i == Integer.MIN_VALUE)
           return "-2147483648";
       int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
       char[] buf = new char[size];
       getChars(i, size, buf);
       return new String(0, size, buf);
   }

首先,它检查它的值是==是否是最低可能的整数,并返回它是否相等。如果没有,那么它会使用String的{​​{1}}方法检查stringSize()需要的大小,以用作字符数组的大小。

Integer以下实施;

stringSize()

一旦它具有正确大小的 static int stringSize(int x) { for (int i=0; ; i++) if (x <= sizeTable[i]) return i+1; } ,它就会使用char[]方法填充该数组,如下所示;

getChars()

对于stackoverflow答案,解释每个单独的步骤将花费太长时间。然而,最相关的部分(正如评论中所指出的)是 static void getChars(int i, int index, char[] buf) { int q, r; int charPos = index; char sign = 0; if (i < 0) { sign = '-'; i = -i; } // 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]; } // Fall thru to fast mode for smaller numbers // assert(i <= 65536, i); for (;;) { q = (i * 52429) >>> (16+3); r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ... buf [--charPos] = digits [r]; i = q; if (i == 0) break; } if (sign != 0) { buf [--charPos] = sign; } } 方法,除了复杂的位移之外,它基本上是用于查找每个字符的消除过程。我恐怕在不超出自己的理解的情况下,我无法进行更多细节。