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

Java Integer.toString()如何在内部工作?,java,integer,tostring,Java,Integer,Tostring,我发现之前也有人问过类似的问题: 但这并不是说这个函数内部是如何工作的。当我打开Integer.toString()的内部源代码时,普通初级java程序员无法理解 有人能用简短的描述解释一下内部发生的事情吗 注:这是我最近被问到的面试问题之一。我不知道如何回答这样的问题 integer.toString()的no-arg调用只调用静态方法integer.toString(int i)(使用integer变量自身的原语值),实现如下 public static String toString

我发现之前也有人问过类似的问题:

但这并不是说这个函数内部是如何工作的。当我打开
Integer.toString()
的内部源代码时,普通初级java程序员无法理解

有人能用简短的描述解释一下内部发生的事情吗



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

integer.toString()的no-arg调用只调用静态方法
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);
   }
一旦它有一个大小正确的
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;
       }
   }
静态void getChars(int i,int index,char[]buf){
int q,r;
int charPos=索引;
字符符号=0;
if(i<0){
符号='-';
i=-i;
}
//每次迭代生成两位数
而(i>=65536){
q=i/100;
//真的:r=i-(q*100);

r=i-((q)对于这个网站来说,它一点也不简单,可能太宽了。可能最好用谷歌搜索一下。
String.valueOf(this);
@sᴜʀᴇsʜᴀᴛᴛᴀ 不是这个,而是对提供的基中的所有数字进行迭代的包装值,每个数字都被转换为其相应的
字符
。然后字符数组被转换为
字符串
。这会不会不起作用。..String number=123+“”;@assylias-更新后的答案将与关于此主题的SO答案一样深入(空间有限)。添加了
stringSize()
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;
       }
   }