strbukan objek, ini referensi ke objek. "Hello"dan "Help!"dua Stringbenda 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 s1yang 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. s2masih menunjuk ke objek yang sama seperti yang kita setel awalnya s1. Pengaturan s1untuk "Help!"hanya mengubah referensi , sedangkan Stringobjek 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
oldChardalam string saat ini, buat salinan dari string saat ini di mana semua kemunculan oldChardiganti newChar.
- Jika
oldChartidak ada dalam string saat ini, kembalikan string saat ini.
Jadi ya, "Mississippi".replace('i', '!')buat Stringobjek 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.