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