http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
iddia String.equals()
kullanım "=="
karşılaştırma String
göre, önce nesneleri
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
Dizelerin uzunluklarını ve ardından içerikleri karşılaştırır.
(Bu arada, bir satış kataloğundaki ürün kodu dizeleri aynı uzunlukta olmakla yükümlüdür - BIC0417 bir bisikletçinin güvenlik kaskı, TIG0003 canlı bir yetişkin erkek kaplan - muhtemelen bunlardan birini sipariş etmek için her türlü lisansa ihtiyacınız var. belki aynı zamanda bir kask sipariş etsen iyi olur.)
Bu nedenle, Dizelerinizi intern()
sürümleriyle değiştirmekten yarar görüyorsunuz, ancak equals()
programlamanız için "==" kullanmadan güvenlik ve okunabilirlik ve standart uyumluluk elde edersiniz. Ve söyleyeceğim şeylerin çoğu, eğer doğruysa, doğru olmasına bağlıdır.
Ama String.equals()
kullanmadan önce onu başka bir nesne değil, bir String geçirdiğinizi test ediyor "=="
mu? Söylemek için nitelikli değilim, ama tahmin ediyorum, çünkü ezici bir çoğunlukla bu tür equals()
işlemler String to String olacak, bu yüzden test neredeyse her zaman geçti. Gerçekten de, "==" için öncelik vermek, Dizeyi String.equals()
sık sık aynı gerçek nesneyle karşılaştırdığınıza dair bir güven anlamına gelir.
Umarım kimse aşağıdaki satırların "yanlış" sonucunu üretmesine şaşırmaz:
Integer i = 1;
System.out.println("1".equals(i));
Değiştirmek Ama eğer i
karşı i.toString()
ikinci satırında, tabii ki var true
.
Stajyerlikten faydalanmayı ümit edebileceğiniz yerler Set
ve Map
tabii ki. İnterned dizeleri kendi hashcodes önbellek var umarım ... Bence bu bir zorunluluktur. Ve umarım bana sadece bir milyon dolar kazanabilecek bir fikir vermedim. :-)
Belleğe gelince, Dizelerinizin hacmi büyükse veya program kodunuz tarafından kullanılan belleğin çok küçük olmasını istiyorsanız, bunun önemli bir sınır olduğu da açıktır. -Distinct- Dizeleri hacminiz çok büyükse, bunları yönetmek için ayrılmış veritabanı program kodu ve ayrı bir veritabanı sunucusu kullanmayı düşünmenin zamanı gelmiş olabilir. Aynı şekilde, Dizelerini hiç saklamamasını sağlayarak küçük bir programı (aynı anda 10000 örnekte çalışması gerekir) geliştirebilirseniz.
Yeni bir Dize oluşturmak ve ardından intern()
yerine koymak için hemen atmak çok zordur , ancak yinelenen Dize'yi tutmak dışında net bir alternatif yoktur. Yani gerçekten yürütme maliyeti, stajyer havuzunda dizenizi aramak ve daha sonra çöp toplayıcının orijinali atmasına izin vermektir. Ve eğer bir dize değişmezse, zaten zaten stajyer olarak gelir.
intern()
Bazı String ve onların nesne başvuruları intern()
havuzda zaten var olup olmadığını belirlemek için kötü amaçlı program kodu tarafından kötüye kullanıp kullanamayacağını merak ediyorum ve bu nedenle bilinmesi gereken Java oturumunda başka bir yerde var. Ama bu sadece program kodu zaten güvenilir bir şekilde kullanıldığında mümkün olurdu, sanırım. Yine de, ATM PIN numaralarınızı saklamak ve hatırlamak için programınıza eklediğiniz üçüncü taraf kütüphaneleri hakkında düşünmeniz gereken bir şey!