Jawab satu:
Salah satu pertanyaan wawancara Java yang paling populer adalah: Apa yang dimaksud dengan objek yang tidak dapat diubah (objek yang tidak dapat diubah), apa manfaat dari objek yang tidak dapat diubah, dan dalam kondisi apa objek tersebut harus digunakan? Atau lebih khusus lagi, mengapa kelas String Java harus disetel ke an tipe yang tidak dapat diubah?
Objek yang tidak dapat diubah, seperti namanya, adalah objek yang tidak dapat diubah setelah dibuat. Contoh umumnya adalah kelas String di Java.
Copy kode kodenya sebagai berikut:
Tali s = "ABC";
s.toLowerCase();
Seperti di atas, s.toLowerCase() tidak mengubah nilai "ABC", tetapi membuat kelas String baru "abc" dan kemudian mengarahkan instance baru ke variabel s.
Objek yang tidak dapat diubah memiliki banyak keunggulan dibandingkan objek yang dapat diubah:
1). Objek yang tidak dapat diubah dapat meningkatkan efisiensi dan keamanan String Pool. Jika Anda mengetahui bahwa suatu objek tidak dapat diubah, maka ketika Anda perlu menyalin konten objek tersebut, Anda tidak perlu menyalinnya sendiri tetapi hanya alamatnya. Menyalin alamatnya (biasanya seukuran pointer) memerlukan memori yang sangat sedikit dan sangat efisien. Ini tidak akan mempengaruhi variabel lain yang mereferensikan "ABC" ini secara bersamaan.
2). Objek yang tidak dapat diubah aman untuk multi-utas, karena ketika beberapa utas berjalan pada saat yang sama, nilai objek yang dapat diubah kemungkinan besar akan diubah oleh proses lain, yang akan menyebabkan hasil yang tidak dapat diprediksi, dan penggunaan objek yang tidak dapat diubah adalah Ini. situasi dapat dihindari.
Tentu saja, ada alasan lain, tetapi alasan terbesar mengapa Java menetapkan String ke immutable adalah efisiensi dan keamanan.
Jawaban kedua:
Ini adalah pertanyaan lama namun masih populer. Mendesain String agar tidak dapat diubah di Java adalah hasil dari mempertimbangkan berbagai faktor. Untuk memahami masalah ini, Anda perlu mengintegrasikan pertimbangan memori, sinkronisasi, dan data , saya akan membuat rangkuman berbagai alasannya.
1. Kebutuhan akan kumpulan string yang konstan
Kumpulan konstanta string (kumpulan string, kumpulan magang string, kumpulan retensi string) adalah tempat penyimpanan khusus di memori heap Java. Saat membuat objek String, jika nilai string sudah ada di kumpulan konstan, maka tidak akan dibuat objek, tetapi referensi ke objek yang sudah ada.
Seperti yang ditunjukkan dalam kode berikut, hanya satu objek String aktual yang akan dibuat di memori heap.
Copy kode kodenya sebagai berikut:
String s1 = "abcd";
String s2 = "abcd";
Diagram skemanya adalah sebagai berikut:
Jika objek string dibiarkan berubah, maka akan menimbulkan berbagai kesalahan logika. Misalnya, mengubah satu objek akan memengaruhi objek independen lainnya. Sebenarnya, gagasan kumpulan konstan ini adalah metode pengoptimalan.
Coba pikirkan: Jika kodenya seperti berikut, apakah s1 dan s2 akan tetap menunjuk ke objek String sebenarnya yang sama?
Copy kode kodenya sebagai berikut:
Tali s1= "ab" + "cd";
Tali s2= "abc" + "d";
Mungkin pertanyaan ini berlawanan dengan intuisi bagi pemula, tetapi mengingat kompiler modern akan melakukan optimasi reguler, mereka semua akan menunjuk ke objek yang sama di kumpulan konstan. Alternatifnya, Anda dapat menggunakan alat seperti jd-gui untuk melihat dokumen kelas yang dikompilasi.
2. Izinkan objek String untuk menyimpan HashCode dalam cache
Kode hash objek String di Java sering digunakan, seperti dalam container seperti hashMap.
Kekekalan string memastikan keunikan kode hash, sehingga dapat di-cache dengan percaya diri. Ini juga merupakan metode pengoptimalan kinerja, yang berarti tidak perlu menghitung kode hash baru setiap saat. Ada kode berikut dalam definisinya dari kelas String :
Copy kode kodenya sebagai berikut:
private int hash;//digunakan untuk menyimpan HashCode dalam cache
3. Keamanan
String digunakan sebagai parameter oleh banyak kelas Java (perpustakaan), seperti URL alamat koneksi jaringan, jalur file, dan parameter String yang diperlukan oleh mekanisme refleksi. Jika String tidak diperbaiki, maka akan menyebabkan berbagai risiko keamanan.
Jika ada kode berikut:
Copy kode kodenya sebagai berikut:
koneksi boolean(string s){
jika (!isSecure(s)) {
melempar SecurityException();
}
// Jika String dapat dimodifikasi di tempat lain, berbagai masalah/kesalahan tak terduga akan terjadi di sini.
sebabMasalah;
}
Secara umum, alasan mengapa String tidak dapat diubah mencakup pertimbangan desain, masalah optimasi efisiensi, dan keamanan. Faktanya, ini juga merupakan jawaban atas banyak pertanyaan "mengapa" dalam wawancara Java.
Jawaban 3: Manfaat kekekalan kelas String
String adalah kelas yang paling umum digunakan dalam semua bahasa. Kita tahu bahwa di Java, String tidak dapat diubah dan final. Java juga menyimpan kumpulan String saat runtime, yang menjadikan String sebagai kelas khusus.
Manfaat kekekalan kelas String
1. Penggabungan string hanya dimungkinkan jika string tidak dapat diubah. Penerapan kumpulan string dapat menghemat banyak ruang heap saat runtime, karena variabel string yang berbeda menunjuk ke string yang sama di kumpulan. Tetapi jika string adalah variabel, maka Interning string tidak akan dapat dilakukan (Catatan Penerjemah: Interning string berarti hanya satu string berbeda yang disimpan, yaitu beberapa string identik tidak akan disimpan.), karena dalam hal ini, jika sebuah variabel mengubah nilainya, maka nilai variabel lain yang menunjuk ke nilai tersebut juga akan berubah.
2. Jika stringnya variabel, maka akan menyebabkan masalah keamanan yang serius. Misalnya, nama pengguna dan kata sandi database diteruskan sebagai string untuk mendapatkan koneksi database, atau dalam pemrograman soket, nama host dan port diteruskan sebagai string. Karena string tidak dapat diubah, nilainya tidak dapat diubah, jika tidak, peretas dapat mengeksploitasi celah dan mengubah nilai objek yang ditunjuk oleh string tersebut, sehingga menyebabkan kerentanan keamanan.
3. Karena string tidak dapat diubah, maka string tersebut aman untuk multi-thread, dan instance string yang sama dapat dibagikan oleh beberapa thread. Hal ini menghilangkan kebutuhan untuk menggunakan sinkronisasi karena masalah keamanan thread. String itu sendiri aman untuk thread.
4. Pemuat kelas menggunakan string, dan kekekalan memberikan keamanan sehingga kelas yang benar dimuat. Misalnya, jika Anda ingin memuat kelas java.sql.Connection, dan nilai ini diubah menjadi myhacked.Connection, ini akan menyebabkan kerusakan yang tidak diketahui pada database Anda.
5. Karena string tidak dapat diubah, kode hash disimpan dalam cache saat dibuat dan tidak perlu dihitung ulang. Hal ini membuat string sangat cocok sebagai kunci di Maps, dan string dapat diproses lebih cepat dibandingkan objek kunci lainnya. Inilah sebabnya mengapa kunci di HashMap sering menggunakan string.
Di atas adalah ringkasan saya tentang manfaat kekekalan string.