Конкатенация строк в Java - Вопросы
Всего: 5 вопросов
1. Сформулируйте правило: когда оператор + в Java выполняет конкатенацию, а когда сложение?
Сформулируйте правило: когда оператор + в Java выполняет конкатенацию, а когда сложение?
Если хотя бы один из операндов + имеет тип String, оператор выполняет конкатенацию: второй операнд приводится к строке (через String.valueOf), и результатом становится новая строка. Если же оба операнда числовые, выполняется обычное арифметическое сложение. Цепочка + вычисляется слева направо, поэтому порядок важен: как только промежуточный результат стал строкой, все последующие + тоже превращаются в конкатенацию.
2. Почему 1 + 2 + "x" даёт "3x", а "x" + 1 + 2 даёт "x12"?
Почему 1 + 2 + "x" даёт "3x", а "x" + 1 + 2 даёт "x12"?
Оператор + левоассоциативен и вычисляется слева направо. В 1 + 2 + "x" сначала считается 1 + 2 (оба числа) = 3, затем 3 + "x" = "3x". В "x" + 1 + 2 сначала "x" + 1 = "x1" — строка уже "включилась", — затем "x1" + 2 = "x12". Число справа не переключает режим обратно на арифметику: скобки нужны, если требуется сначала сложить числа.
3. Почему для сравнения содержимого двух строк нельзя полагаться на ==?
Почему для сравнения содержимого двух строк нельзя полагаться на ==?
Оператор == сравнивает ссылки (адреса объектов в памяти), а не символы внутри строк. Две строки с одинаковым содержимым вполне могут быть разными объектами, и тогда == вернёт false. Для сравнения содержимого используйте str1.equals(str2) или Objects.equals(str1, str2) — второй безопасен при null. Иногда == срабатывает "случайно" из-за пула строковых литералов, но это неочевидный момент, на котором легко ошибиться.
4. Чему эквивалентно выражение str += x для строки str, и почему им не стоит злоупотреблять в циклах?
Чему эквивалентно выражение str += x для строки str, и почему им не стоит злоупотреблять в циклах?
Запись str += x эквивалентна str = str + x: значение x приводится к строке, конкатенируется с текущим значением str, и ссылка str перезаписывается на новый объект. Поскольку String неизменяем, каждый шаг создаёт новую строку. В цикле с большим числом итераций это порождает множество временных объектов и работает медленно — там уместнее StringBuilder.
5. Как ведёт себя тип char при работе с оператором +?
Как ведёт себя тип char при работе с оператором +?
Всё решает второй операнд. Если оба операнда числовые (например 'A' + 'B'), char повышается до int по своему коду Unicode и происходит арифметика: 'A'=65, 'B'=66, результат 131. Но если хотя бы один операнд — String (например "" + 'A' + 'B'), то char добавляется как символ, и результат — "AB". Символ можно записать и Unicode-эскейпом: 'A' — это тот же 'A', а в строке "AB" = "AB".