Включает ли компилятор Java сворачивание строковых констант? - PullRequest
5 голосов
/ 21 декабря 2011

Я обнаружил, что Java поддерживает постоянное свертывание примитивных типов , но как насчет String s?

Пример

Если ясоздать следующий исходный код

out.write(""
        + "<markup>"
        + "<nested>"
        + "Easier to read if it is split into multiple lines"
        + "</nested>"
        + "</markup>"
        + "");

Что входит в скомпилированный код?

Комбинированная версия?out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

Или менее эффективная версия конкатенации во время выполнения?out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

Ответы [ 3 ]

14 голосов
/ 21 декабря 2011

Вот простой тест:

public static void main(final String[] args) {
    final String a = "1" + "2";
    final String b = "12";        

    System.out.println(a == b);
}

Вывод:

true

Так что, да, компилятор сворачивается.

1 голос
/ 21 декабря 2011

Будет использоваться комбинированная версия .
Компилятор оптимизирует это автоматически и помещает в пул строк.

Вы можете легко доказать это поведение, написав эту строку.

System.out.println("abc" == "a" + ("b" + "c")); // Prints true

То, что это печатает true, означает, что это одинаковые объекты Это из-за двух вещей:

  1. Компилятор оптимизировал "a" + ("b" + "c") до "abc".
  2. Компилятор помещает все строковые литералы в пул строк. Это поведение называется String Interning .
0 голосов
/ 21 декабря 2011

Эффективно переводится как: out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

...