How do I convert from int to String?

后端 未结 20 3330
不思量自难忘°
不思量自难忘° 2020-11-21 23:40

I\'m working on a project where all conversions from int to String are done like this:

int i = 5;
String strI = \"\" + i;
         


        
20条回答
  •  天命终不由人
    2020-11-22 00:19

    Normal ways would be Integer.toString(i) or String.valueOf(i).

    The concatenation will work, but it is unconventional and could be a bad smell as it suggests the author doesn't know about the two methods above (what else might they not know?).

    Java has special support for the + operator when used with strings (see the documentation) which translates the code you posted into:

    StringBuilder sb = new StringBuilder();
    sb.append("");
    sb.append(i);
    String strI = sb.toString();
    

    at compile-time. It's slightly less efficient (sb.append() ends up calling Integer.getChars(), which is what Integer.toString() would've done anyway), but it works.

    To answer Grodriguez's comment: ** No, the compiler doesn't optimise out the empty string in this case - look:

    simon@lucifer:~$ cat TestClass.java
    public class TestClass {
      public static void main(String[] args) {
        int i = 5;
        String strI = "" + i;
      }
    }
    simon@lucifer:~$ javac TestClass.java && javap -c TestClass
    Compiled from "TestClass.java"
    public class TestClass extends java.lang.Object{
    public TestClass();
      Code:
       0:    aload_0
       1:    invokespecial    #1; //Method java/lang/Object."":()V
       4:    return
    
    public static void main(java.lang.String[]);
      Code:
       0:    iconst_5
       1:    istore_1
    

    Initialise the StringBuilder:

       2:    new    #2; //class java/lang/StringBuilder
       5:    dup
       6:    invokespecial    #3; //Method java/lang/StringBuilder."":()V
    

    Append the empty string:

       9:    ldc    #4; //String
       11:    invokevirtual    #5; //Method java/lang/StringBuilder.append:
    (Ljava/lang/String;)Ljava/lang/StringBuilder;
    

    Append the integer:

       14:    iload_1
       15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:
    (I)Ljava/lang/StringBuilder;
    

    Extract the final string:

       18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:
    ()Ljava/lang/String;
       21:    astore_2
       22:    return
    }
    

    There's a proposal and ongoing work to change this behaviour, targetted for JDK 9.

提交回复
热议问题