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"
Відредагуйте, щоб відповісти на зміни ОП:
Якщо ви подивитеся на вихідний код 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 На насправді, це можна мутувати рядки (і інші незмінні об'єкти). Він вимагає роздумів і є дуже, дуже небезпечним і ніколи не повинен використовуватися, якщо ви насправді не зацікавлені в знищенні програми.