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