Примечание: При использовании Системного объема (, как упомянуто на этой странице ), Знатоку нужны полные пути.
, Если Ваши банки находятся под корнем Вашего проекта, Вы захотите снабдить префиксом свои значения systemPath $ {basedir}.
Это время байт-кода!
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 }
Вы получите новую строку после выполнения строки
s += "";
Java выделяет новый объект String и присваивает его s после конкатенации строк. Если у вас есть под рукой eclipse (и я предполагаю, что вы можете делать то же самое в NetBeans, но я когда-либо использовал только eclipse), вы можете установить точку останова на этой строке и посмотреть идентификаторы объектов, на которые указывает s до и после выполнения этой строки. В моем случае идентификатор объекта s перед этой строкой кода был id = 20, а после был id = 24.