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

5
我发现之前有类似的问题被问到过: Float.toString() 和 Integer.toString() 如何工作?

但是这并没有涉及到函数内部是如何工作的。当我打开 Integer.toString() 的源代码时,对于普通的 Java 初级程序员来说看不懂。
请问有人可以简短地解释一下内部的运作原理吗?
注意:这是我最近面试遇到的问题之一。我不知道该如何回答这样的问题!

这并不简单,可能对于这个网站来说也太宽泛了。最好还是去谷歌搜索一下。 - Bathsheba
String.valueOf(this); - Suresh Atta
@sᴜʀᴇsʜᴀᴛᴛᴀ 不是这个,而是被包装的值。 - Puce
在提供的基数中迭代所有数字,每个数字都转换为其相应的“char”。然后将字符数组转换为“String”。 - Pphoenix
这个会不会行呢.. String number=123+""; - Stunner
“这个问题以前已经被问过了,但是它并没有说明那个函数的内部工作原理。请再去看看那个问题,并且特别关注 Stephen C 的答案。他用两句话解释了算法的核心。如果你懂数学,那么就很明显了。不幸的是,如果你不懂数学,那么 StackOverflow 可能不是你寻求知识的最佳场所。” - Solomon Slow
1个回答

8
< p > integer.toString() 的无参调用只是调用静态方法 Integer.toString(int i)(使用整数变量自己的原始值),其实现如下:
  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);
   }

首先,它会检查它的值是否等于最小可能整数,如果相等,则返回该值。如果不是,则使用Integer的stringSize()方法检查所需的String大小,并使用其作为字符数组的大小。下面是stringSize()的实现;
  static int stringSize(int x) {
       for (int i=0; ; i++)
           if (x <= sizeTable[i])
               return i+1;
   }

一旦有了正确大小的char[],它就会使用下面实现的getChars()方法来填充该数组;

  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;
       }
   }

解释每个步骤对于一个stackoverflow答案来说需要太长时间。然而,最相关的部分(正如评论中指出的)是getChars()方法,除了复杂的位移操作之外,它本质上是通过排除法找到每个字符的过程。恐怕我不能在不超出我的理解范围的情况下提供比这更详细的解释。

@assylias - 更新了答案,尽可能详细地介绍了这个主题(考虑到有限的空间)。添加了stringSize()getChars()的实现。 - Rudi Kershaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接