Java String оптимизация - PullRequest
4 голосов
/ 06 мая 2011

Сколько строк это создает?

String test(String text) {
  return "string 1 " +
    text + " string 2 " +
    "string 3";
}

Ответы [ 4 ]

6 голосов
/ 06 мая 2011

Здесь нет новых вызовов String, только один существует в StringBuilder.toString, поэтому

1

java.lang.String test(java.lang.String);
  Code:
   Stack=3, Locals=2, Args_size=2
   0:   new #16; //class java/lang/StringBuilder
   3:   dup
   4:   ldc #18; //String string 1 
   6:   invokespecial   #20; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   9:   aload_1
   10:  invokevirtual   #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   13:  ldc #27; //String  string 2 
   15:  invokevirtual   #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   18:  ldc #29; //String string 3
   20:  invokevirtual   #23; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   23:  invokevirtual   #31; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   26:  areturn
4 голосов
/ 06 мая 2011

На этот вопрос довольно легко ответить, скомпилировав код, а затем проверив байт-код с помощью javap -c.В этом конкретном случае компилятор должен генерировать код, подобный

String result = new StringBuilder("string1").
    append(text).append("string2").append("string3").toString();

, поэтому в зависимости от того, как вы на него смотрите, вы можете сказать только один, или если вы один из тех людей, которым нравится считать литералы какбудучи «созданным», когда их используют, можно сказать четыре.

3 голосов
/ 06 мая 2011

javap твой друг. Я поместил ваш код в S.java и разобрал его, используя javap -c S:

Compiled from "S.java"
public class S extends java.lang.Object{
public S();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public java.lang.String test(java.lang.String);
  Code:
   0:   new     #2; //class java/lang/StringBuilder
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   7:   ldc     #4; //String string 1 
   9:   invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   12:  aload_1
   13:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   16:  ldc     #6; //String  string 2 
   18:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   21:  ldc     #7; //String string 3
   23:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   26:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   29:  areturn

}

В OpenJDK 1.6.0_22 создан только один StringBuilder и одна строка.

0 голосов
/ 06 мая 2011

это эквивалент

 (new StringBuilder((new StringBuilder((new StringBuilder("String 1")).append(text).toString())).append("string 2 ").toString()).append("string 3").toString();

это 3 строителя строк и 6 строк. Способ оптимизировать это:

    StringBuilder sb = new StringBuilder("string 1");
    sb.append(test);
    sb.append(" string 2 ");
    sb.append("string 3");
    return sb.toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...