str
не является объектом, это ссылка на объект. "Hello"
и "Help!"
- это два различных String
объектов. Таким образом, str
указывает на строку.Вы можете изменить то, что он указывает на, но не то, что он очка на.
Возьмите этот код, например:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Теперь нет ничего мы могли бы сделать, чтобы 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"
Редактировать, чтобы ответить на редактирование параметров порядка:
Если вы посмотрите на source code for 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 для вымышленного метода он демонстрирует разницу между неизменным объектом и другими. – Zappi
Спасибо gustafc за правильные примеры и четкое объяснение .... Но можете ли вы просто ответить на отредактированную часть в вопросе, пожалуйста? Это позволит понять мое понимание. –
Я никогда не видел такого ответа раньше. Обсуждали каждую деталь. –