String.format vs Конкатенация в Java: что быстрее и лучше?
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
При требовании точности и локализации рекомендуется использовать String.format
, поскольку он вносит ясность в разграничение текста и переменных. Но для простых манипуляций со строками без специфических форматирований вполне подойдёт конкатенация с использованием +
или StringBuilder
.
Пример замены значений в строке при помощи String.format
:
String message = String.format("Привет, %s. Баланс: %d.", "Джон", 120);
Пример объединения строк методом конкатенации:
String message = "Привет, " + "Джон" + ". Баланс: " + 120 + ".";

Почему стоит выбрать String.format?
String.format
весьма полезен для локализации, благодаря выделению шаблона строки от её содержимого, что упрощает задачу перевода:
ResourceBundle messages = ResourceBundle.getBundle("messages", Locale.US);
String template = messages.getString("greeting");
String message = String.format(template, "Джон", 120);
С его помощью можно осуществлять контроль над порядком и форматом переменных, а также использовать одну и ту же переменную несколько раз:
String info = String.format("%1$s должен %2$.2f долларов. %1$s заплатил %2$.2f.", "Адам", 98.25);
StringBuilder и производительность
При отдаче предпочтения производительности StringBuilder
оказывается на первом месте, особенно это заметно при использовании в циклах:
StringBuilder builder = new StringBuilder();
for (int i = 0; i < большое_число; i++) {
builder.append(i).append(" ");
}
Однако JVM берёт на себя оптимизацию конкатенации с помощью +
, применяя последовательность операций с StringBuilder
. В результате для простых задач вы можете спокойно использовать +
, при этом сохраняя читаемость кода.
Возможности сложного форматирования с помощью String.format
String.format
предоставляет набор функций для работы со строками, которые не могут быть осуществлены через конкатенацию:
String fancyStr = String.format("Итог: %08d; Дата: %tB %<te, %<tY", 123, new Date());
Этот метод обеспечивает типобезопасность вставляемых значений и поддерживает локализацию.
Читаемость кода и личные предпочтения
Ваш выбор между String.format
и методом конкатенации может основываться на личных предпочтениях и восприятии читаемости того или иного метода:
`String.format`: "Ценю структурированность и гибкость форматов." 🏗️
в противовес
Конкатенации строк: "Написание нерасторопно и чтение непринужденно." 💨
Если важна простота и скорость работы, вы можете выбрать конкатенацию:
String url = protocol + "://" + domain + ":" + port + "/";
Вопросы обеспечения безопасности
String.format
подвержен определённым уязвимостям, связанным с printf
, особенно при неправильном использовании спецификаторов формата:
try {
String output = String.format("%s %s", "привет");
} catch (java.util.MissingFormatArgumentException e) {
System.err.println("Недостаточно аргументов для форматирования!");
}
Конкатенация же предоставляет статическую типизацию, что обеспечивает большую надёжность.
Визуализация
Можно провести аналогию с пазлом, чтобы помочь понять разницу между двумя методами:
🧩 Использование String.format: Все элементы идеально соответствуют друг другу.
vs.
🧩 Использование конкатенации строк: Соединяем несовместимые части, и результат выглядит нестандартно.
Правило по выбору метода
Воспользуйтесь следующим чеклистом для определения подходящего в каждом конкретном случае метода:
- Интернационализация? ➜
String.format
- Сложное форматирование? ➜
String.format
- Необходимость производительности для критических участков кода? ➜
StringBuilder
- Простая конкатенация строк? ➜
+
- Читаемость кода:
String.format
или конкатенация строк? ➜ Вопрос предпочтений. - Важность статической проверки типов? ➜ Конкатенация строк.
- Управление файлами ресурсов? ➜
String.format
- Приоритет безопасности? ➜ Используйте
String.format
с осторожностью.
Полезные материалы
- Следует ли использовать String.format() в Java, если важна производительность? – Stack Overflow – Обсуждение влияния
String.format
на производительность. - StringBuilder (Java Platform SE 7 ) – Документация по
StringBuilder
. - Formatter (Java Platform SE 7 ) – Описание класса
Formatter
, который используется вString.format
. - OpenJDK: jmh – Инструмент бенчмаркинга Java Microbenchmark Harness (JMH).
- java – Конкатенация строк: метод concat() против оператора "+" – Stack Overflow – Обзор работы оптимизации конкатенации строк.