Java tasarımcılarının tasarım yaparken gerçekte ne düşündüğünden emin String
olamayız, ancak bu nedenleri sadece ipin değişmezliğinden elde ettiğimiz avantajlara dayanarak sonuçlandırabiliriz, bazıları
1. String Sabit Havuzun Varlığı
Tartışıldığı gibi Neden dize dize Sabit Havuz depolanıyor makalesinde, her uygulama çok fazla dize nesneleri ve bunları toplamaya birinci oluşturma dize nesnelerin sürü sonra çöpten JVM kurtarmak için yaratır. JVM, tüm dize nesnelerini String sabit havuzu adı verilen ayrı bir bellek alanında depolar ve bu önbelleğe alınmış havuzdaki nesneleri yeniden kullanır.
Bir dize hazır bilgisi oluşturduğumuzda, JVM ilk olarak bu hazır bilginin sabit havuzda zaten var olup olmadığını görür ve varsa, yeni başvuru SCP'de aynı nesneyi işaret etmeye başlar.
String a = "Naresh";
String b = "Naresh";
String c = "Naresh";
Değeriyle Yukarıdaki örnek dize nesnesinde Naresh
yalnızca bir kez SCP oluşturulmuş olur ve tüm referans a
, b
, c
biz de değişiklik yapmaya çalışırsanız aynı nesneye ama ne işaret eder a
mesela a.replace("a", "")
.
İdeal olarak, a
değeri olmalıdır Nresh
ama b
, c
çünkü biz değişimi yapıyoruz, bir son kullanıcı olarak değişmeden kalmalıdır a
sadece. Ve biliyoruz a
, b
, c
biz bir değişiklik yapmak eğer öyleyse hepsi aynı nesneyi işaret ediyor a
, diğerleri de değişime yansıtmalıdır.
Ancak dize değişmezliği bizi bu senaryodan kurtarır ve dize nesnesinin değişmezliği nedeniyle dize nesnesi Naresh
asla değişmez. Bu nedenle a
, dize nesnesindeki değişiklik yerine herhangi bir değişiklik yaptığımızda Naresh
JVM, yeni bir nesne oluşturur a
ve bu nesneye değişiklik yapar.
Dize havuzu yalnızca String'in değişmezliği nedeniyle mümkündür ve String değiştirilemezse, dize nesnelerini önbelleğe alma ve bunları yeniden kullanma olasılığı yoktur çünkü herhangi bir değişken değeri değiştirmiş ve diğerlerini bozmuştur.
Ve bu yüzden JVM tarafından çok özel olarak ele alındı ve özel bir hafıza alanı verildi.
2. İplik Güvenliği
Bir nesne üzerinde birden fazla iş parçacığı çalışırken iş parçacığı için güvenli olarak adlandırılır, ancak hiçbiri durumunu bozamaz ve nesne herhangi bir zamanda her iş parçacığı için aynı durumu tutamaz.
Biz değişmez bir nesne yaratıldıktan sonra hiç kimse tarafından değiştirilemez, bu da her değişmez nesneyi varsayılan olarak iş parçacığı için güvenli kılar. Senkronize yöntemler oluşturmak gibi herhangi bir iş parçacığı güvenlik önlemi uygulamamıza gerek yoktur.
Bu nedenle, değişmez doğası nedeniyle string nesnesi birden çok iş parçacığı tarafından paylaşılabilir ve birçok iş parçacığı tarafından manipüle ediliyor olsa bile değerini değiştirmez.
3. Güvenlik
Her uygulamada, kullanıcının kullanıcı adı \ parolaları, bağlantı URL'leri gibi çeşitli sırları iletmemiz gerekir ve genel olarak, tüm bu bilgiler dize nesnesi olarak iletilir.
Diyelim ki String, doğada değişmez olmazsa, uygulama için ciddi bir güvenlik tehdidine neden olur, çünkü bu değerlerin değiştirilmesine izin verilir ve izin verilirse, yanlış yazılmış kod veya başka herhangi bir kişi nedeniyle değişebilir. Değişken referanslarımıza erişebilir.
4. Sınıf Yükleme
Tartışıldığı gibi , Örnek Java ile yansıma bir nesne oluşturma , kullanabiliriz Class.forName("class_name")
daha başka yöntemler bunun için çağırır bellekte bir sınıfı yüklemek için bir yöntem. Ve JVM bile sınıfları yüklemek için bu yöntemleri kullanır.
Ancak açıkça görüyorsanız, bu yöntemlerin tümü sınıf adını bir dize nesnesi olarak kabul eder, bu nedenle Dizeler java sınıfı yüklemesinde kullanılır ve değişmezlik, doğru sınıfın yüklendiği güvenliği sağlar ClassLoader
.
Dize'nin değişmez olup olmayacağını varsayalım ve java.lang.Object
bunlar org.theft.OurObject
arasında değiştirilen yüklemeye çalışıyoruz ve şimdi tüm nesnelerimizin birinin istenmeyen şeylere kullanabileceği bir davranışı var.
5. HashCode Önbellekleme
Herhangi bir nesne üzerinde karma işlemlerini gerçekleştireceksek, hashCode()
yöntemi geçersiz kılmalı ve nesnenin durumunu kullanarak doğru bir karma kodu oluşturmaya çalışmalıyız. Bir nesnenin durumu değişiyorsa, bu, karma kodunun da değişmesi gerektiği anlamına gelir.
String değişmez olduğu için, bir string nesnesinin tuttuğu değer asla değişmez, yani hashcode değişmez, bu da String sınıfına nesne oluşturma sırasında hashcode'unu önbelleğe alma fırsatı verir.
Evet, String nesnesi, nesne oluşturma sırasında hashcode'unu önbelleğe alır, bu da hashcode'un yeniden hesaplanması gerekmediğinden, bize biraz zaman kazandırması gerekmediği için ilgili işlemler için mükemmel bir adaydır. Bu nedenle String çoğunlukla HashMap
anahtar olarak kullanılır .
Java'da Dizginin Neden Değişmez ve Nihai Olduğuna Dair Daha Fazla Bilgi .