Существует ли “самый быстрый путь” для построения Строк в Java?

У меня была эта проблема, я закончил с этим (в конце концов, if и 2 return, с таким образом многоречива!):

int? ParseNInt (string val)
{
    int i;
    return int.TryParse (val, out i) ? (int?) i : null;
}

На более серьезной ноте, попытайтесь не смешаться int, который является ключевым словом C#, с Int32, который является Платформой.NET тип BCL - хотя он работает, он просто заставляет код выглядеть грязным.

16
задан Redandwhite 3 December 2009 в 18:47
поделиться

9 ответов

If there is only one string then:

String foo = "123456";

Is fastest. You'll notice that the String.format line has "%s%" declared in it, so I don't see how the lecturer could possibly think that was faster. Plus you've got a method call on top of it.

However, if you're building a string over time, such as in a for-loop, then you'll want to use a StringBuilder. If you were to just use += then you're building a brand new string every time the += line is called. StringBuilder is much faster since it holds a buffer and appends to that every time you call append.

25
ответ дан 30 November 2019 в 15:08
поделиться

Вся эта дискуссия спорный. Пожалуйста, прочтите эту статью Джеффа, то есть парня, создавшего Stack Overflow.

Печальная трагедия театра микрооптимизации

Пожалуйста, отсылайте своего инструктора к этому посту и попросите его перестать портить мозги своему ученику бесполезными Информация. Алгоритмическая оптимизация - это то, где ваш код будет жить или умереть, а не то, какой метод вы используете для создания строк. В любом случае StringBuilder и средство форматирования строк должны выполнять АКТУАЛЬНЫЙ КОД с НАСТОЯЩЕЙ ПАМЯТЬЮ, если вы просто создаете строку, она откладывается во время компиляции и готова к использованию, когда вам это нужно, по сути, она имеет 0 запусков - временные затраты, в то время как другие варианты имеют реальную стоимость, так как код действительно необходимо выполнить.

11
ответ дан 30 November 2019 в 15:08
поделиться
String foo = "some string literal";

Is certainly the fastest way to make a String. It's embedded in the .class file and is a simple memory look-up to retrieve.

Using String.format when you have nothing to really format just looks ugly and might cause junior developers to cry.

If the String is going to be modified, then StringBuilder is the best since Strings are immutable.

8
ответ дан 30 November 2019 в 15:08
поделиться

Во втором примере использование:

String foo = String.format("%s", 123456);

не купить вам что-нибудь; 123456 уже является постоянным значением, так почему бы просто не присвоить foo = "123456"? Для константных строк нет лучшего способа.

Если вы создаете строку из нескольких частей, добавляемых вместе во время выполнения, используйте StringBuffer или StringBuilder (первый является поточно-ориентированным).

5
ответ дан 30 November 2019 в 15:08
поделиться

If your string is known at compile-time, then using a literal is best: String foo = "123456";.

If your string is not known at compile-time and is composed of an aggregation of smaller strings, StringBuilder is usually the way to go (but beware thread-safety!).

Using String foo = String.format("%s", 123456); could reduce your .class' size and make class-loading it a tiny bit faster, but that would be extremely aggressive (extreme) memory tuning there ^^.

4
ответ дан 30 November 2019 в 15:08
поделиться

Вы на 100% уверены, что преподаватель говорил не о чем-то вроде:

String foo = "" + 123456;

Я вижу, что мои ученики делают такие вещи «все время» (горстка будет делать это каждый семестр ). Причина, по которой они это делают, заключается в том, что в какой-то книге им показано, как это сделать. Качать головой и кулаком ленивым писателям!

2
ответ дан 30 November 2019 в 15:08
поделиться

As has been pointed out, if you're just building a single string with no concatenation, just use String.

For concatenating multiple bits into one big string, StringBuffer is slower than StringBuilder, but StringBuffer is synchronized. If you don't need synchronization, StringBuilder.

3
ответ дан 30 November 2019 в 15:08
поделиться

Первый приведенный вами пример является самым быстрым и простым. Используйте это.

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

Я бы предположил, что пример 2 как минимум в 10–100 раз медленнее, чем пример 1, а пример 3 примерно в 2 раза медленнее чем в примере 2.

Ваш процессор предоставил какое-либо обоснование для этого утверждения?

BTW: Ваш первый пример вообще не создает String (поэтому он самый быстрый), он просто передает вам String, находящийся в пул констант String.

1
ответ дан 30 November 2019 в 15:08
поделиться

Слегка не по теме, но я хочу, чтобы развеялся весь миф о том, что «нельзя использовать-плюс-конкатенировать-строки-в-Java». Хотя в ранних версиях Java могло быть правдой, что StringBuffer был быстрее и «+ был злом», это определенно неверно в современных JVM, которые заботятся о большом количестве оптимизаций.

Например, что быстрее?

String s = "abc" + "def";

или

    StringBuffer buf = new StringBuffer();
    buf.append("abc");
    buf.append("def");
    String s = buf.toString();

Ответ первый. JVM распознает, что это строковая константа, и фактически поместит "abcdef" в пул строк, тогда как версия с "оптимизированным строковым буфером" вызовет создание дополнительного объекта StringBuffer.

Другая оптимизация JVM -

String s = onestring + " concat " + anotherstring;

Где JVM решит, какой будет лучший способ конкатенации. В JDK 5

14
ответ дан 30 November 2019 в 15:08
поделиться
Другие вопросы по тегам:

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