Например,
String s = "Hello" + " World";
Я знаю, что существует две строки в пуле "Привет" и "Мире", но, делает: "Привет Мир" входит в строковый пул?
Если так, что относительно?
String s2 = new String("Hola") + new String(" Mundo");
Сколько строк находится там в пуле в каждом случае?
Я думаю, что в первом случае компилятор будет умным и поместит конкатенированную строку в пул (т.е. у вас будет только 1 строка)
Да, если String
образуется путем конкатенации двух String
литералов, она также будет интернирована.
Из JLS:
Таким образом, тестовая программа, состоящая из блок компиляции (§7.3):
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
and the compilation unit:
package other;
public class Other { static String hello = "Hello"; }
выдает результат:
true
true
true
true
false
true
Важными строками являются 4 и 5. 4 представляет то, о чем вы спрашиваете в первом случае; 5 показывает, что происходит, если единица не является литералом (или, в более общем случае, константой времени компиляции).
Нет. В пул должны попадать только строковые литералы. Компиляторы могут оптимизировать конкатенацию и могут хранить дополнительные строковые литералы в пуле.
Чтобы подтвердить ответ @Brian Агнью, я посмотрел на этот код:
public class InternTest {
public static void main(String[] args) {
String s = "Hello" + ", world";
System.out.println(s);
}
}
Это поведение требуется для строковых литералов и константных выражений , которые вычисляются как String
.
javap -c InternTest Compiled from "InternTest.java" public class InternTest extends java.lang.Object{ public InternTest(); 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 Hello, world 2: astore_1 3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream; 6: aload_1 7: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 10: return