Строки создаются с + конкатенация, сохраненная в строковом пуле?

Например,

 String s = "Hello" + " World";

Я знаю, что существует две строки в пуле "Привет" и "Мире", но, делает: "Привет Мир" входит в строковый пул?

Если так, что относительно?

String s2 = new String("Hola") + new String(" Mundo");

Сколько строк находится там в пуле в каждом случае?

10
задан IAdapter 12 June 2010 в 17:23
поделиться

4 ответа

Я думаю, что в первом случае компилятор будет умным и поместит конкатенированную строку в пул (т.е. у вас будет только 1 строка)

4
ответ дан 3 December 2019 в 23:48
поделиться

Да, если 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 показывает, что происходит, если единица не является литералом (или, в более общем случае, константой времени компиляции).

11
ответ дан 3 December 2019 в 23:48
поделиться

Нет. В пул должны попадать только строковые литералы. Компиляторы могут оптимизировать конкатенацию и могут хранить дополнительные строковые литералы в пуле.

-2
ответ дан 3 December 2019 в 23:48
поделиться

Чтобы подтвердить ответ @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
1
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

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