0

В одном из моих ява инструментов, я несколько строк создается многократно с изменяющимися переменными, содержащимися в так как:Java строка параметризация

for (String value : values) { 
    // unrelated code omitted for clarity 
    String outputValue = "blah blah blah " + foo + " blah " + bar + " blah"; 
    // code that writes out the created outputValue 
} 

Я не могу помочь, но чувствую, что это не самый лучший способ, имеющий " параметров "в некотором смысле в созданном String, так как непараметрический текст всегда один и тот же. Однако, как я понимаю, использование String.format или аналогичное подключению этих параметров фактически будет менее эффективным, чем простая конкатенация.

Есть ли более эффективный (по сравнению с памятью) способ создания этих параметризованных строк?

+0

Я не знаю более эффективного во время выполнения, но String.format() более эффективен с точки зрения ввода. –

+0

Субъективно, но тогда ссылка в ответе Джири Кремерса подчеркивает, что время выполнения конкатенации приходит в соотношении против 'String.format' около 5-6 соответственно. – Quetzalcoatl

ответ

0

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

Какие у вас есть доказательства? И почему вы думаете, что было бы интересно беспокоиться в свете всего, что делает ваше приложение? Похоже на микро-оптимизацию для меня.

Я бы порекомендовал любое решение для шаблонов, такое как Velocity, если ваши потребности обширны.

+0

Это в редукторе hadoop, и есть потенциально миллионы строк, проходящих через, поэтому я думал, что все, что я могу сделать, чтобы улучшить его, не повредит. Что касается String.format, то он должен обработать строку, чтобы определить, где добавить эти параметры, а не просто прямую конкатенацию, которая, несомненно, будет более дешевым процессом. – Quetzalcoatl

+0

По-прежнему нет доказательств того, что я вижу, кроме «Я так говорю». – duffymo

+0

http://stackoverflow.com/questions/513600/should-i-use-javas-string-format-if-performance-is-important Приходит в соотношении времени 5: 6 в соответствии с этим. – Quetzalcoatl

0

Наиболее эффективным способом, вероятно, будет с StringBuilder.

StringBuilder builder = new StringBuilder("blah blah blah"); 
builder.append(yourvalue).append("blah"); 

Что позволяет StringBuilder избегать множественных и дорогих конкатенаций строк. Когда вы наконец закончите, вы просто вызываете builder.toString(), чтобы получить финальную строку.

+0

На самом деле это не могло бы сделать ничего, кроме, возможно, «более чистого» кода - помните, что я не добавлял одну строчку за значение, поэтому мне понадобился бы новый строитель каждый раз. – Quetzalcoatl

+2

Компилятор будет делать это в любом случае. –

+0

Его не «чище» код, его более эффективный код. И нет, компилятор этого не сделал. – BlackBox

0

Это компромисс между приятным чтением с одним слоем и суперэффективным, чтобы прочитать фрагмент кода, используя StringBuffer или StringBuilder. По-моему, нет универсального ответа на этот вопрос. Зависит от того, что качество является более ценным для вас (читаемость -> ремонтопригодности или производительности), сколько раз он называется, это действительно узкое место в вашем приложении, и т.д.

Вот хороший summarization

+0

Для этого компилятор будет использовать 'StringBuilder', поскольку это единственная строка. Таким образом, это задержка между форматированием и '+'. –

+0

Правильно, для этого конкретного случая + эквивалентно 'StringBuilder', но если есть' outputValue + = "a" + foo + "b" + bar + "c" ', это не так. Я хотел бы упомянуть вещи явно и не полагаться на какую-то магию под капотом :) –

-1

Дон» t попытайтесь оптимизировать это, используя String.format или StringBuilder.append вместо конкатенации строк с помощью + (особенно в петлях).

+0

StringBuilders - это не решение здесь - нет итеративного добавления к той же строке, что и здесь. Это новая строка каждый раз, и конкатенация обрабатывается StringBuilders под капотом в любом случае. – Quetzalcoatl

+0

Это единственная строка, компилятор будет использовать 'StringBuilder'. Как указывает OP, 'String.format' медленнее, чем' + 'в этом случае (поскольку компилятор заменит' StringBuilder'). –