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 На самом деле, это является можно мутировать строки (и другие неизменные объекты). Это требует размышлений и очень, очень опасно и никогда не должно использоваться, если вы действительно не заинтересованы в уничтожении программы.