Что происходит в компиляции и времени выполнения при конкатенации пустой строки в Java?

Примечание: При использовании Системного объема (, как упомянуто на этой странице ), Знатоку нужны полные пути.

, Если Ваши банки находятся под корнем Вашего проекта, Вы захотите снабдить префиксом свои значения systemPath $ {basedir}.

5
задан Matt Ball 27 July 2009 в 19:12
поделиться

2 ответа

Это время байт-кода!

class EmptyString {
    public static void main(String[] args) {
        String s = "any old string";
        s += "";
    }
}

javap -c EmptyString :

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

public static void main(java.lang.String[]);
  Code:
   0:   ldc     #2; //String any old string
   2:   astore_1
   3:   new     #3; //class java/lang/StringBuilder
   6:   dup
   7:   invokespecial   #4; //Method java/lang/StringBuilder."":()V
   10:  aload_1
   11:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   14:  ldc     #6; //String
   16:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   22:  astore_1
   23:  return

}

Вы можете видеть, что + = вызывает StringBuilder для быть создан независимо от того, что он объединяет, поэтому его нельзя оптимизировать во время выполнения.

С другой стороны, если вы поместите оба строковых литерала в одно и то же выражение, они будут объединены компилятором:

class EmptyString {
    public static void main(String[] args) {
        String s = "any old string" + "";
    }
}

javap -c EmptyString :

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

public static void main(java.lang.String[]);
  Code:
   0:   ldc     #2; //String any old string
   2:   astore_1
   3:   return

}
16
ответ дан 18 December 2019 в 09:09
поделиться

Вы получите новую строку после выполнения строки

s += "";

Java выделяет новый объект String и присваивает его s после конкатенации строк. Если у вас есть под рукой eclipse (и я предполагаю, что вы можете делать то же самое в NetBeans, но я когда-либо использовал только eclipse), вы можете установить точку останова на этой строке и посмотреть идентификаторы объектов, на которые указывает s до и после выполнения этой строки. В моем случае идентификатор объекта s перед этой строкой кода был id = 20, а после был id = 24.

2
ответ дан 18 December 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: