Зачем мне переопределять строку, если я использую метод replace?

1

Почему мне нужно переопределить переменную theString если я использую метод replace в этом коде:

String theString = "I w@nt to h@ve the regul@r \"A\"!";
theString = theString.replace("@", "a");
System.out.println(theString);

Почему я не могу:

theString.replace("@", "a");

и что это?

  • 0
    Я начинаю думать, что Java-дизайнеры взорвали его, вызвав этот метод на replace . Кажется, мы постоянно получаем один и тот же вопрос. Возможно, другое имя прояснило бы, что он возвращает новую строку, преобразовывая старую. Ну хорошо ... слишком поздно ...
  • 0
    @ajb: до тех пор, пока студенты Java повторяют для себя снова и снова: «Строки неизменны, Строки неизменны», тогда это не должно быть проблемой.
Теги:
string
replace

4 ответа

7
Лучший ответ

Строки неизменяемы - вы не можете изменить их, как только они были созданы. Конечно, есть исключения, если вы используете рефлексивную магию, но, по большей части, их следует рассматривать как инварианты. Поэтому метод replace(...) не меняет String, он не может, а скорее создает и возвращает новую String. Поэтому, чтобы иметь возможность использовать эту новую строку, вам нужно получить доступ к ее ссылке, и это можно сделать, назначив ее переменной String или даже исходной переменной String. Это обсуждение доходит до сути того, что представляет собой различие между объектом и ссылочной переменной.

3

В опубликованных ответах упоминается техническая причина (строки неизменяемы), но не следует упоминать, почему это так. См. Так: Почему строки неизменны во многих языках программирования?

3

Поскольку объекты String по своей конструкции являются неизменяемыми, вам нужно создать новую строку, которая будет содержать ваши изменения

1

Взято из этой ссылки

В Java String не реализуется как массивы символов, как в других языках программирования. Вместо этого строка реализуется как экземпляр класса String.

Строки являются константами/неизменяемыми, и их значения не могут быть изменены после их создания. Если любые операции, которые приводят к изменению строки, выполняются, создается и возвращается новый экземпляр объекта String. Этот подход выполняется для эффективности реализации Java.

Рекомендуется использовать StringBuffer или StringBuilder, когда необходимо много изменений в String. StringBuffer похож на String, но может быть изменен. StringBuffer является потокобезопасным, и все методы синхронизированы. StringBuilder эквивалентен StringBuffer и предназначен для использования одним потоком. Поскольку методы не синхронизированы, это происходит быстрее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню