Cum funcționează în mod intern Integer.toString()? (Programare, Java, Număr Întreg, Tostring)

sgokhales a intrebat.

Am constatat că o întrebare similară a mai fost pusă aici : cum funcționează Float.toString() și Integer.toString()?

Dar aici nu se vorbește despre cum funcționează intern această funcție. Când am deschis codul sursă intern al Integer.toString(), acesta nu este de înțeles pentru un programator java junior normal.

Poate cineva să explice, vă rog, ce se întâmplă la nivel intern într-o scurtă descriere?


NOTĂ : Aceasta a fost una dintre întrebările de interviu care mi-au fost adresate recent. Nu aveam nicio idee despre cum să răspund la o astfel de întrebare !

Comentarii

  • Nu este deloc simplă și probabil prea amplă pentru acest site. Probabil că cel mai bine este să o căutați pe Google. –  > Por Bathsheba.
  • String.valueOf(this); –  > Por Suresh Atta.
  • @sᴜʀᴇsʜᴀᴛᴛᴛᴀ nu asta, ci valoarea înfășurată –  > Por Puce.
  • Iterând peste toate numerele din baza furnizată, fiecare număr este convertit în numărul său corespunzător char. Matricea de caractere este apoi convertită într-un fișier String. –  > Por Pphoenix.
  • nu va funcționa acest lucru .. String number=123+””; – –  > Por Stunner.
1 răspunsuri
Rudi Kershaw

Apelul fără arg al lui integer.toString() apelează pur și simplu metoda statică Integer.toString(int i) (folosind integer propria valoare primitivă a variabilelor), care este implementată după cum urmează;

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

În primul rând, se verifică dacă valoarea sa este == cel mai mic număr întreg posibil și o returnează dacă este egală. În caz contrar, se verifică ce dimensiune are String trebuie să fie, utilizând valoarea stringSize() din Integer pentru a fi folosită ca dimensiune a unui tablou de caractere.

stringSize() Implementarea de mai jos;

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

Odată ce are o char[] de dimensiunea corectă, apoi populează acel array folosind metoda getChars() implementată mai jos;

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

Explicarea fiecărui pas individual ar dura mult prea mult timp pentru un răspuns stackoverflow. Totuși, cea mai pertinentă secțiune (așa cum a fost semnalată în comentarii) este secțiunea getChars() care, lăsând la o parte deplasarea complicată a biților, este în esență un proces de eliminare pentru găsirea fiecărui caracter. Mi-e teamă că nu pot intra în mai multe detalii decât atât fără să depășesc propria mea înțelegere.

Comentarii

  • @assylias – Răspuns actualizat pentru a fi cât mai aprofundat pe cât poate fi un răspuns SO pe acest subiect (având în vedere spațiul limitat). Au fost adăugate implementări pentru stringSize() și getChars(). –  > Por Rudi Kershaw.