Kami tidak dapat memastikan apa yang sebenarnya dipikirkan oleh perancang Java saat mendesain, String
tetapi kami hanya dapat menyimpulkan alasan-alasan ini berdasarkan keuntungan yang kami dapatkan dari kekekalan tali, Beberapa di antaranya adalah
1. Adanya String Constant Pool
Seperti yang dibahas dalam Mengapa String Disimpan dalam artikel String Constant Pool , setiap aplikasi membuat terlalu banyak objek string dan untuk menyelamatkan JVM dari pertama membuat banyak objek string dan kemudian mengumpulkan sampah mereka. JVM menyimpan semua objek string dalam area memori terpisah yang disebut String constant pool dan menggunakan kembali objek dari pool cache tersebut.
Setiap kali kita membuat string literal, JVM pertama kali melihat apakah literal itu sudah ada dalam kumpulan konstan atau tidak dan jika ada, referensi baru akan mulai menunjuk ke objek yang sama di SCP.
String a = "Naresh";
String b = "Naresh";
String c = "Naresh";
Dalam contoh di atas objek string dengan nilai Naresh
akan bisa dibuat di SCP hanya sekali dan semua referensi a
, b
, c
akan menunjuk ke objek yang sama tetapi bagaimana jika kita mencoba untuk membuat perubahan a
misalnya a.replace("a", "")
.
Idealnya, a
harus memiliki nilai Nresh
tetapi b
, c
harus tetap tidak berubah karena sebagai pengguna akhir kami hanya melakukan perubahan a
. Dan kita tahu a
, b
, c
semua yang menunjuk objek yang sama jadi jika kita membuat perubahan dalam a
, orang lain juga harus mencerminkan perubahan.
Tetapi string immutability menyelamatkan kita dari skenario ini dan karena immutability objek string objek string Naresh
tidak akan pernah berubah. Jadi, ketika kita membuat perubahan, a
bukannya mengubah objek string, Naresh
JVM membuat objek baru yang menetapkannya a
lalu membuat perubahan pada objek itu.
Jadi string pool hanya mungkin karena String tidak dapat diubah dan jika String tidak akan berubah, maka caching objek string dan menggunakannya kembali tidak akan memiliki kemungkinan karena variabel apa pun telah mengubah nilai dan merusak yang lain.
Dan itulah mengapa ditangani oleh JVM dengan sangat khusus dan telah diberikan area memori khusus.
2. Keamanan Thread
Objek disebut thread-safe ketika beberapa utas beroperasi di atasnya tetapi tidak satu pun dari mereka yang dapat merusak kondisinya dan objek memiliki status yang sama untuk setiap utas pada setiap titik waktu.
Karena kita objek yang tidak dapat diubah tidak dapat dimodifikasi oleh siapa pun setelah penciptaannya yang membuat setiap objek yang tidak dapat diubah adalah thread yang aman secara default. Kami tidak perlu menerapkan langkah-langkah keamanan ulir apa pun untuk itu seperti membuat metode yang disinkronkan.
Jadi karena objek string sifatnya yang tidak berubah dapat dibagikan oleh banyak utas dan bahkan jika ia dimanipulasi oleh banyak utas, ia tidak akan mengubah nilainya.
3. Keamanan
Di setiap aplikasi, kita perlu menyampaikan beberapa rahasia misalnya nama pengguna \ kata sandi, URL koneksi dan secara umum, semua informasi ini diteruskan sebagai objek string.
Sekarang anggaplah jika String tidak akan berubah di alam maka itu akan menyebabkan ancaman keamanan serius pada aplikasi karena nilai-nilai ini diperbolehkan untuk diubah dan jika diizinkan maka ini mungkin bisa berubah karena kode yang ditulis secara salah atau orang lain yang memiliki akses ke referensi variabel kami.
4. Memuat Kelas
Seperti yang dibahas dalam Membuat objek melalui Refleksi di Java dengan Contoh , kita bisa menggunakan Class.forName("class_name")
metode untuk memuat kelas di memori yang lagi-lagi memanggil metode lain untuk melakukannya. Dan bahkan JVM menggunakan metode ini untuk memuat kelas.
Tetapi jika Anda melihat dengan jelas semua metode ini menerima nama kelas sebagai objek string sehingga Strings digunakan dalam pemuatan kelas java dan imutabilitas memberikan keamanan yang dapat dimasuki oleh kelas yang benar ClassLoader
.
Misalkan jika String tidak akan berubah dan kami mencoba memuat java.lang.Object
yang bisa diubah org.theft.OurObject
di antaranya dan sekarang semua objek kami memiliki perilaku yang dapat digunakan seseorang untuk hal-hal yang tidak diinginkan.
5. Cache HashCode
Jika kita akan melakukan operasi hashing apa pun pada objek apa pun, kita harus mengganti hashCode()
metode tersebut dan mencoba menghasilkan kode hash yang akurat dengan menggunakan status objek. Jika keadaan objek semakin berubah yang berarti kode hashnya juga harus berubah.
Karena String tidak dapat diubah, maka nilai yang dipegang satu objek string tidak akan pernah berubah yang berarti kode hashnya juga tidak akan berubah yang memberikan kelas String peluang untuk melakukan cache kode hash-nya selama pembuatan objek.
Ya, objek String mem-cache kode hash-nya pada saat pembuatan objek yang menjadikannya kandidat terbaik untuk hashing operasi terkait karena kode hash tidak perlu dihitung lagi yang menghemat waktu kita. Inilah sebabnya mengapa String sebagian besar digunakan sebagai HashMap
kunci.
Baca Lebih Lanjut tentang Mengapa String Tidak Berubah dan Final di Jawa .