str
это не объект, это ссылка на объект. "Hello"
и "Help!"
- это два разных объекта String
. Таким образом, str
указывает на строку. Вы можете изменить то, на что оно указывает на , но не то, на что оно указывает на .
Возьмите этот код, например:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Теперь, нет ничего 1 , которое мы могли бы сделать с s1
, которое могло бы повлиять на значение s2
. Они ссылаются на один и тот же объект - строку "Hello"
- но этот объект неизменен и, следовательно, не может быть изменен.
Если мы сделаем что-то вроде этого:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Здесь мы видим разницу между изменением объекта и изменением ссылки. s2
по-прежнему указывает на тот же объект, который мы изначально установили для s1
. Установка s1
на "Help!"
только изменяет ссылку , тогда как объект String
, на который он первоначально ссылался, остается неизменным.
Если бы строки были изменяемыми, мы могли бы сделать что-то вроде этого:
String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"
Изменить, чтобы ответить на редактирование OP:
Если вы посмотрите на исходный код для String.replace (char, char) (также доступный в src.zip в вашем каталоге установки JDK), совет для профессионалов - искать там, когда вам интересно, как что-то действительно работает) вы можете видеть следующее:
- Если в текущей строке есть одно или несколько вхождений
oldChar
, создайте копию текущей строки, где все вхождения oldChar
заменены на newChar
.
- Если
oldChar
отсутствует в текущей строке, вернуть текущую строку.
Так что да, "Mississippi".replace('i', '!')
создает новый объект String
. Опять же, верно следующее:
String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects
Ваша домашняя работа на данный момент состоит в том, чтобы увидеть, что делает приведенный выше код, если вы измените s1 = s1.replace('i', '!');
на s1 = s1.replace('Q', '!');
:)
1 На самом деле, можно изменять строки (и другие неизменные объекты). Это требует размышлений и очень, очень опасно и никогда не должно использоваться, если вы на самом деле не заинтересованы в уничтожении программы.