str
bukan objek, ini referensi ke objek. "Hello"
dan "Help!"
dua String
benda berbeda . Dengan demikian, str
menunjuk ke sebuah string. Anda dapat mengubah apa yang ditunjukkannya , tetapi bukan apa yang ditunjukkannya .
Ambil kode ini, misalnya:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Sekarang, tidak ada 1 yang bisa kami lakukan untuk s1
yang akan mempengaruhi nilai s2
. Mereka merujuk ke objek yang sama - string "Hello"
- tetapi objek itu tidak berubah dan dengan demikian tidak dapat diubah.
Jika kita melakukan sesuatu seperti ini:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Di sini kita melihat perbedaan antara bermutasi suatu objek, dan mengubah referensi. s2
masih menunjuk ke objek yang sama seperti yang kita setel awalnya s1
. Pengaturan s1
untuk "Help!"
hanya mengubah referensi , sedangkan String
objek yang awalnya dirujuk tetap tidak berubah.
Jika string dapat diubah, kita dapat melakukan sesuatu seperti ini:
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"
Edit untuk menanggapi edit OP:
Jika Anda melihat kode sumber untuk String.replace (char, char) (juga tersedia di src.zip di direktori instalasi JDK Anda - tip pro adalah untuk melihat ke sana setiap kali Anda bertanya-tanya bagaimana sesuatu benar-benar berfungsi) Anda dapat melihat apa yang dilakukannya adalah sebagai berikut:
- Jika ada satu atau lebih kemunculan
oldChar
dalam string saat ini, buat salinan dari string saat ini di mana semua kemunculan oldChar
diganti newChar
.
- Jika
oldChar
tidak ada dalam string saat ini, kembalikan string saat ini.
Jadi ya, "Mississippi".replace('i', '!')
buat String
objek baru . Sekali lagi, yang berikut ini berlaku:
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
Pekerjaan rumah Anda untuk saat ini adalah untuk melihat apa yang dilakukan kode di atas jika Anda berubah s1 = s1.replace('i', '!');
menjadi s1 = s1.replace('Q', '!');
:)
1 Sebenarnya, itu adalah mungkin untuk string bermutasi (dan objek abadi lainnya). Ini membutuhkan refleksi dan sangat, sangat berbahaya dan tidak boleh digunakan kecuali Anda benar-benar tertarik menghancurkan program.