簡體   English   中英

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

[英]How does Integer.toString() works internally?

我發現之前已經問過類似的問題: Float.toString()和Integer.toString()是如何工作的?

但這並沒有談到該功能如何在內部運作。 當我打開Integer.toString()的內部源代碼時,普通的初級java程序員是不可理解的。

有人可以解釋一下內部的簡短說明嗎?


注意:這是我最近被問到的面試問題之一。 我不知道如何回答這個問題!

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

首先,它檢查它的值是否==最低可能的整數,並返回它是否相等。 如果沒有,那么它使用IntegerstringSize()方法檢查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()方法,除了復雜的位移之外,它基本上是用於查找每個字符的消除過程。 如果不超出我的理解,我恐怕不能再深入細節了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM