Из коробки у вас есть 3 способа вставить значение переменной в String
, когда вы пытаетесь достичь:
1.Самый простой способ
Вы можете просто использовать оператор +
между String
и любым типом объекта или примитива, он автоматически объединит String
и
- В случаеобъекта, значение
String.valueOf(obj)
, соответствующее String
"null
", если obj
равно null
, в противном случае значение obj.toString()
. - Inслучай примитивного типа, эквивалентный
String.valueOf(<primitive-type>)
.
Пример с не null
объектом:
Integer theNumber = 42;
System.out.println("Your number is " + theNumber + "!");
Выход:
Your number is 42!
Пример с null
объектом:
Integer theNumber = null;
System.out.println("Your number is " + theNumber + "!");
Выход:
Your number is null!
Пример с примитивным типом:
int theNumber = 42;
System.out.println("Your number is " + theNumber + "!");
Выход:
Your number is 42!
2.Явный и, возможно, самый эффективный способ
Вы можете использовать StringBuilder
(или StringBuffer
поточно-ориентированный устаревший аналог) для создания своего String
используя append
методы.
Пример:
int theNumber = 42;
StringBuilder buffer = new StringBuilder()
.append("Your number is ").append(theNumber).append('!');
System.out.println(buffer.toString()); // or simply System.out.println(buffer)
Вывод:
Your number is 42!
За кулисами, это на самом деле, как последние Javaкомпиляторы преобразуют все конкатенации String
, выполненные с помощью оператора +
, единственное отличие от предыдущего способа заключается в том, что у вас есть полный контроль .
Действительно, компиляторы будут использовать конструктор по умолчанию , поэтому емкость по умолчанию (16
), поскольку они не имеют представления, какой будет конечная длина String
для сборки, чтоозначает, что если окончательная длина больше, чем 16
, емкость будет обязательно увеличена, что имеет цену с точки зрения производительности.
Поэтому, если вы заранее знаете, что размер вашего окончательного String
будет больше, чем 16
, будет гораздо эффективнее использовать этот подход для обеспечения лучшей начальной емкости.Например, в нашем примере мы создаем String
, длина которого больше 16, поэтому для лучшей производительности его следует переписать следующим образом:
Пример оптимизирован:
int theNumber = 42;
StringBuilder buffer = new StringBuilder(18)
.append("Your number is ").append(theNumber).append('!');
System.out.println(buffer)
Выход:
Your number is 42!
3.Наиболее читаемый способ
Вы можете использовать методы String.format(locale, format, args)
или String.format(format, args)
, которые оба полагаются на Formatter
для построенияваш String
.Это позволяет вам указать формат вашего окончательного String
, используя заполнители, которые будут заменены значением аргументов.
Пример:
int theNumber = 42;
System.out.println(String.format("Your number is %d!", theNumber));
// Or if we need to print only we can use printf
System.out.printf("Your number is still %d with printf!%n", theNumber);
Вывод:
Your number is 42!
Your number is still 42 with printf!
Наиболее интересным аспектом этого подхода является тот факт, чточто у нас есть четкое представление о том, что будет окончательным String
, потому что его гораздо легче читать, а его гораздо легче поддерживать.