Строковая неизменность

Это потому, что большая часть человечества использовала юлианский календарь в 1235 году, и с тех пор перешла на григорианский.

Даты Java в старом стиле делают все возможное, чтобы учесть это, когда они могут определить локаль при переключении с Джулиана на Календарь.

Когда эти изменения были сделаны, дата в этих странах переключилась на другое место в календаре, что выглядело так, как будто дата пропустила несколько дней.

Более новая система java.time. * Игнорирует историческое существование юлианских календарей и плохо подходит для представления временных промежутков в исторических датах.

12
задан Aaron Daniels 16 December 2008 в 19:18
поделиться

9 ответов

Компилятор имеет специальный режим для конкатенации строк, которая является, почему вторым примером является только когда-либо одна строка. И "интернирование" означает, что даже при выполнении этой строки 20000 раз, существует все еще только 1 строка.

Ре, тестирующее результаты... самый легкий путь (в этом случае), должно, вероятно, посмотреть в отражателе:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string s)
    L_0000: ldstr "goodbye cruel world!"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: call void [mscorlib]System.Console::WriteLine(string)
    L_000c: ret 
}

Как Вы видите (ldstr), компилятор уже сделал это для Вас.

21
ответ дан 2 December 2019 в 06:46
поделиться

Литеральные строки интернируются, это означает это "hello " не находится на "куче", но в сегменте данных [видят комментарий] проножки (и таким образом не имеет право на сборку "мусора"), то же идет для "world", что касается "hello world" это может быть также интернировано, если компилятор достаточно умен.

"goodbye cruel world" будет интернирован, так как конкатенация строкового литерала является чем-то рассматриваемым компилятором.


Править: Я не уверен в операторе сегмента данных, посмотрите этот вопрос для получения дополнительной информации.

3
ответ дан 2 December 2019 в 06:46
поделиться

На самом деле, вероятно, 3. строка константы для "до свидания", строка константы для "жестокого мира" и затем новая строка для результата.

Можно узнать наверняка путем рассмотрения сгенерированного кода. Это зависит от компилятора, (и, на самом деле, от языка, это не очевидно), но можно считать вывод g ++ при помощи флага-a (я думаю, проверяю страницу справочника) получить промежуточный код.

0
ответ дан 2 December 2019 в 06:46
поделиться

Не доверяйте тому, что Вы "Знаете" о строках. Вы могли бы просмотреть исходный код для реализации строки. Например, Ваш пример:

string s = "goodbye " + "cruel world!";

В Java выделил бы единственную строку. Java играет некоторые довольно милые приемы и был бы тверд перехитрить - просто никогда не оптимизируют, пока Вы не должны!

В настоящее время однако, насколько я знаю, с помощью этого:

String s="";
for(int i=0;i<1000;i++)
    s+=" ";

создать 1 000 строк пространства все еще имеет тенденцию быть чрезвычайно неэффективным

Добавление в цикле довольно плохо, но иначе это, вероятно, столь же эффективно как StringBuilder.

0
ответ дан 2 December 2019 в 06:46
поделиться

Будьте осторожны здесь, потому что компилятор может сделать некоторую совсем другую оптимизацию, когда строковые значения известны во время компиляции. Если строки, которые Вы используете, не будут известны то до времени выполнения (вытянутый из файла конфигурации, базы данных или ввода данных пользователем) Вы будете видеть некоторый совсем другой IL.

0
ответ дан 2 December 2019 в 06:46
поделиться

Если бы Вы просто собираетесь сделать одну или две конкатенации строк, я не волновался бы об этом.

Однако, если у Вас есть партия конкатенаций, или у Вас есть цикл, затем Вы определенно хотите принять меры предосторожности. В мире Java, который означает, Вы используете StringBuffer insteads конкатенирующей строки.

0
ответ дан 2 December 2019 в 06:46
поделиться

Любой ценой преждевременно не оптимизируйте, но не обесценивайте, как плохо производительная строка concatonations может быть. Это не создание объекта, но работа GC, которую это вызывает.

Существует лаборатория на (Инженер технической поддержки ASP.NET) блог Tess Ferrnandez, что шоу (скорее экстремальное значение, предоставленное) пример того, как строка concatonation может принести сервер к своим коленям.

0
ответ дан 2 December 2019 в 06:46
поделиться

Если это не находится только в одной строке, конкатенация двух строк может быть выполнена путем превращения первой строки в StringBuffer, выполнения конкатенации и возврата строки результата.

Создание StringBuffer самостоятельно может походить на излишество, но это - то, что собирается произойти anyway.-

0
ответ дан 2 December 2019 в 06:46
поделиться

Если компилятор будет "интеллектуален", то это только будет одна строка с "до свидания жестоким миром!"

-1
ответ дан 2 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

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