Конкатенация строк и символов
Описание проблемы:
Я сталкиваюсь с неожиданным поведением при конкатенации строк в 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[]?