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

sgo*_*les 4 java integer tostring

我发现之前已经问过类似的问题:Float.toString()和Integer.toString()是如何工作的?

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

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


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

Rud*_*haw 6

no arg调用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);
   }
Run Code Online (Sandbox Code Playgroud)

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

stringSize() 实施如下;

  static int stringSize(int x) {
       for (int i=0; ; i++)
           if (x <= sizeTable[i])
               return i+1;
   }
Run Code Online (Sandbox Code Playgroud)

一旦它具有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;
       }
   }
Run Code Online (Sandbox Code Playgroud)

对于stackoverflow答案,解释每个单独的步骤将花费太长时间.然而,最相关的部分(如评论中所指出的)是getChars()一种方法,其中,复杂的位移位,基本上是用于找到每个字符的消除过程.在没有超出自己的理解的情况下,我恐怕不能比这更详细.

  • 真正的逻辑是在"getChars"中,乍一看并不明显...... (3认同)