Конкатенация строк и символов
Описание проблемы:
Я сталкиваюсь с неожиданным поведением при конкатенации строк в Java. Рассмотрим следующий код:
String string = "string";
string = string + ((char)65) + 5;
System.out.println(string);
При выполнении этого кода на консоли выводится stringA5
.
Однако если я изменю код на следующий:
String string = "string";
string += ((char)65) + 5;
System.out.println(string);
То на консоли вместо этого я получаю string70
.
В чем заключается разница между этими двумя примерами? Почему в первом случае результатом является строка, а во втором - числовое значение?
4 ответ(ов)
Это тот же случай, как в примере:
System.out.println("abc" + 10 + 5);
выводит abc105 (добавляет как строку), а
System.out.println(5 + 10);
возвращает 15 (добавляет как число).
Строка, присутствующая в (первом месте) операции, заставляет все элементы обрабатываться как строки во время выполнения операции. В вашем случае с +=
, однако, операция выполняется сначала в правой части (обрабатывая элементы как int
) из-за приоритета операторов, а затем результат конкатенируется со строкой.
Вопрос на StackOverflow: В чем разница между операциями сложения строк в Java в двух случаях?
Случай 1:
string = string + ((char)65) + 5;
В данном случае все операции обрабатываются как строковые. Порядок выполнения операций следующий:
string + ((char)65)
становитсяstringA
(гдеA
- это символ, представляющий 'A', который соответствует ASCII 65).stringA + 5
становитсяstringA5
.
Таким образом, если string
изначально был "string", то результат будет "stringA5".
Случай 2:
string += ((char)65) + 5;
В этом случае сначала вычисляется правая часть. Порядок операций таков:
- Сначала выполняется
((char)65) + 5
, что дает результат 70. - Затем происходит сложение:
string + 70
, что в результате возвращаетstring70
.
Если, например, string
было "string", то результат будет "string70".
Еще один пример:
String string = "string";
string += ((char)65) + 5 + "A";
System.out.println(string);
Вывод: string70A
Объяснение: Сначала правая часть вычисляется, и порядок выполнения операций будет следующим:
((char)65) + 5
дает 70.- Далее
70 + "A"
становится "70A" (так как здесь происходит конкатенация со строкой). - И наконец,
string + "70A"
становится "string70A".
Таким образом, итоговый результат — "string70A".
Когда вы пишете:
string = string + ((char)65) + 5;
Это похоже на следующее:
String string = new StringBuilder(string).append((char)65).append((int)5).toString();
Здесь происходит добавление к строке string
символа A
(символьное представление десятичного числа 65) и числа 5
.
В последнем случае вы сначала вычисляете правую часть, а затем добавляете результат к string
. Это можно сравнить с записью:
string = string + 70;
Обратите внимание, что если к строке string
добавить что-то вроде 5
, то Java будет конкатенировать строку, и результатом будет строка, содержащая представление чисел.
Переведем ваш запрос на русский в стиле ответа на StackOverflow:
В строке кода:
string = string + ((char)65) + 5;
это означает «Установить значение переменной string
в результате конкатенации string
, ((char)65)
и 5
». Выражение вычисляется слева направо (сначала string + ((char)65)
, затем результат + 5
). При конкатенации строки и целого числа, целое число автоматически преобразуется в строку.
А в строке кода:
string += ((char)65) + 5;
это означает «Сначала вычисляем результат ((char)65) + 5
, а затем добавляем его к строке string
». Весь右-указанный операнд (правостороннее выражение) вычисляется перед тем, как результат будет добавлен к строке. Поскольку char
фактически представляет собой 16-битное целое число, происходит сложение как с целыми числами - в результате получается 70, и это значение будет добавлено к самой строке string
.
Преобразование 'ArrayList<String>' в 'String[]' в Java
Объединение двух столбцов текста в DataFrame pandas
Как сгенерировать случайную алфавитно-цифровую строку
Как эффективно объединять строки в Go
Как преобразовать строку Java в byte[]?