http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
menegaskan yang String.equals()
digunakan "=="
untuk membandingkan String
objek sebelumnya, menurut
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
itu membandingkan panjang Strings, dan kemudian isinya.
(Ngomong-ngomong, string kode produk dalam katalog penjualan memiliki panjang yang sama - BIC0417 adalah helm keselamatan pengendara sepeda, TIG0003 adalah harimau jantan dewasa yang hidup - Anda mungkin perlu segala macam lisensi untuk memesan salah satunya. Dan mungkin Anda lebih baik memesan helm pengaman secara bersamaan.)
Jadi sepertinya Anda mendapatkan manfaat dari mengganti Strings dengan intern()
versi mereka , tetapi Anda mendapatkan keamanan - dan keterbacaan dan kepatuhan standar - -tanpa- menggunakan "==" untuk equals()
pemrograman Anda. Dan sebagian besar dari apa yang akan saya katakan tergantung pada itu benar, jika itu benar.
Tapi apakah String.equals()
tes yang Anda berikan itu String dan bukan objek lain, sebelum digunakan "=="
? Saya tidak memenuhi syarat untuk mengatakan, tapi saya kira tidak, karena sebagian besar equals()
operasi seperti itu akan menjadi String to String, sehingga tes hampir selalu lulus. Memang, memprioritaskan "==" di dalamnya String.equals()
menyiratkan keyakinan bahwa Anda sering membandingkan String dengan objek aktual yang sama.
Saya harap tidak ada yang terkejut bahwa baris berikut menghasilkan hasil "salah":
Integer i = 1;
System.out.println("1".equals(i));
Tetapi jika Anda beralih i
ke i.toString()
pada baris kedua, tentu saja itu true
.
Tempat-tempat di mana Anda mungkin berharap mendapat manfaat dari magang termasuk Set
dan Map
, tentu saja. Saya berharap bahwa string yang diinternir memiliki kode hash mereka di-cache ... Saya pikir itu akan menjadi persyaratan. Dan saya harap saya tidak hanya memberikan ide yang bisa menghasilkan jutaan dolar bagi saya. :-)
Mengenai memori, jelas juga bahwa itu adalah batas penting jika volume String Anda besar, atau jika Anda ingin memori yang digunakan oleh kode program Anda menjadi sangat kecil. Jika volume Anda -distinct- Strings sangat besar, maka mungkin sudah saatnya untuk mempertimbangkan menggunakan kode program basis data khusus untuk mengelolanya, dan server basis data yang terpisah. Demikian juga, jika Anda dapat meningkatkan program kecil (yang perlu dijalankan dalam 10.000 instance secara bersamaan) dengan membuatnya tidak menyimpan Strings-nya sendiri sama sekali.
Rasanya boros membuat String baru dan kemudian langsung membuangnya untuk intern()
penggantinya, tetapi tidak ada alternatif yang jelas, kecuali untuk menjaga String duplikat. Jadi sebenarnya biaya eksekusi adalah untuk mencari string Anda di kolam magang dan kemudian membiarkan pengumpul sampah untuk membuang yang asli. Dan jika itu adalah string literal maka itu sudah intern-ed pula.
Saya bertanya-tanya apakah intern()
dapat disalahgunakan oleh kode program jahat untuk mendeteksi apakah beberapa String dan referensi objek mereka sudah ada di intern()
kolam renang, dan karena itu ada di tempat lain di sesi Java, ketika itu seharusnya tidak diketahui. Tapi itu hanya mungkin ketika kode program sudah digunakan dengan cara yang dapat dipercaya, saya kira. Namun, ini adalah sesuatu yang perlu dipertimbangkan tentang perpustakaan pihak ketiga yang Anda sertakan dalam program Anda untuk menyimpan dan mengingat nomor PIN ATM Anda!