0

Конкатенация строк и символов

16

Описание проблемы:

Я сталкиваюсь с неожиданным поведением при конкатенации строк в 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 ответ(ов)

0

Это тот же случай, как в примере:

System.out.println("abc" + 10 + 5);

выводит abc105 (добавляет как строку), а

System.out.println(5 + 10);

возвращает 15 (добавляет как число).

Строка, присутствующая в (первом месте) операции, заставляет все элементы обрабатываться как строки во время выполнения операции. В вашем случае с +=, однако, операция выполняется сначала в правой части (обрабатывая элементы как int) из-за приоритета операторов, а затем результат конкатенируется со строкой.

0

Вопрос на StackOverflow: В чем разница между операциями сложения строк в Java в двух случаях?

Случай 1:

string = string + ((char)65) + 5;

В данном случае все операции обрабатываются как строковые. Порядок выполнения операций следующий:

  1. string + ((char)65) становится stringA (где A - это символ, представляющий 'A', который соответствует ASCII 65).
  2. stringA + 5 становится stringA5.

Таким образом, если string изначально был "string", то результат будет "stringA5".


Случай 2:

string += ((char)65) + 5;

В этом случае сначала вычисляется правая часть. Порядок операций таков:

  1. Сначала выполняется ((char)65) + 5, что дает результат 70.
  2. Затем происходит сложение: string + 70, что в результате возвращает string70.

Если, например, string было "string", то результат будет "string70".


Еще один пример:

String string = "string";
string += ((char)65) + 5 + "A";
System.out.println(string);

Вывод: string70A

Объяснение: Сначала правая часть вычисляется, и порядок выполнения операций будет следующим:

  1. ((char)65) + 5 дает 70.
  2. Далее 70 + "A" становится "70A" (так как здесь происходит конкатенация со строкой).
  3. И наконец, string + "70A" становится "string70A".

Таким образом, итоговый результат — "string70A".

0

Когда вы пишете:

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 будет конкатенировать строку, и результатом будет строка, содержащая представление чисел.

0

Переведем ваш запрос на русский в стиле ответа на 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь