Çözüldü Java String ile niye new anahtar kelimesi kullanılmıyor?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

BeyazEsya

Picopat
Katılım
1 Mayıs 2021
Mesajlar
184
Daha fazla  
Cinsiyet
Erkek
Meslek
Öğrenci
Bunun sebebi halihazırda bir nesne oluşturulup her String tanımlamada bu nesneye ait bir diziye eleman mı eklememiz? Yani böyle mi işliyor, bu yüzden mi String name = new String("Technopat"); yerine String name = "Technopat"; kullanılıyor?
 
Çözüm
Hocam benim anladığım:
String name = "bitwise"; denilince önce aynı değerde bir nesnenin olup olmadığına bakilir. Eger yoksa yeni bir nesne oluşturulur. Varsa var olan nesnenin referansı name degiskenine aktarılır.
Fakat String name = new String("bitwise"); dediğimizde hiçbir şey umrunda olmaz. Sadece nesneyi yaratır. Bu yüzden ayni değeri taşısalar bile birden fazla nesne oluşturulabilir.

Doğru mu?
Eğer doğruysa: Neden tek bir nesne oluşturulup her String ifade bir diziye aktarılmıyor? Hem nesne sayısı az olurdu.
Evet dogru.
Burada mesele obje sayisini az yapmaktan ziyade az memory kullanmak. Sen 14 bytelik String'i her defasinda yeniden olusturdugunda memory'den 14 byte tuketmeye devam edeceksin. Reuse edersen sadece 1 defa 14 bytelik yer allocate edeceksin. Garbage collection bunu toplayabilir de, toplamayabilir de.

Burada dizide tutmaktan kastettigin JVM in kendi icindeki memory yonetimi, o kendi icinde veriyi senin Java class'larinda yaptigin gibi yonetmiyor. JVM != Java.

String kendi icinde char[] array i tutuyor, JVM her string icin char malloc() cagiriyor.
Artik Java dunyasindan cikip JVM'in implementasyonuna giriyoruz ki her platform icin bu degiskenlik gosterebilir.

Ayrica senin teklif ettigin gibi dizi kullanmak da toplam obje sayisini dusurmez. 20 elemanli array en az 21 tane obje icerir. ( collection + internal collection + diger yardimci objeler ) Array ya da diger collectionlar da icindeki objelere referans tutuyorlar yalnizca.
Bunun sebebi halihazırda bir nesne oluşturulup her String tanımlamada bu nesneye ait bir diziye eleman mı eklememiz? Yani böyle mi işliyor, bu yüzden mi String name = new String("Technopat"); yerine String name = "Technopat"; kullanılıyor?

String immutable objedir, literal kullanimda JVM'e ayni string objesini cache den kullanma imkani verirsin.
new ile de olusturabilirsin, o halde yeni obje yaratacaktir sana JVM.
Immutable objeyi reuse etmek varken yeni obje yaratmasi da heap icin optimal kullanim degil.
Biraz daha ileri seviye ancak String heavy kullanim yapacagin projelerde JVM in String cache'ini de yine parametrelerle yonetirsin. Ornegin: -XX:StringDeduplicationAgeThreshold gibi.
Teknik olarak new String() kullaniminda bir engel yok, literal kullanim hem memory optimize hem de okumasi daha rahat.
 
String immutable objedir, literal kullanimda JVM'e ayni string objesini cache den kullanma imkani verirsin.
new ile de olusturabilirsin, o halde yeni obje yaratacaktir sana JVM.
Immutable objeyi reuse etmek varken yeni obje yaratmasi da heap icin optimal kullanim degil.
Biraz daha ileri seviye ancak String heavy kullanim yapacagin projelerde JVM in String cache'ini de yine parametrelerle yonetirsin. Ornegin: -XX:StringDeduplicationAgeThreshold gibi.
Teknik olarak new String() kullaniminda bir engel yok, literal kullanim hem memory optimize hem de okumasi daha rahat.
Giriş seviyesi olduğum için maalesef tam anlamış değilim. Şunu buldum ve bu da benim düşündüğüm şeye mi denk geliyor?

 
Giriş seviyesi olduğum için maalesef tam anlamış değilim. Şunu buldum ve bu da benim düşündüğüm şeye mi denk geliyor?

Senin dusundugun seyi de ben anlamadim.
Bunun sebebi halihazırda bir nesne oluşturulup her String tanımlamada bu nesneye ait bir diziye eleman mı eklememiz?

Burda ne demek istedigin net degil.

Ama soyle daha basitce anlatayim; literal kullanimda her defasinda yeni obje yaratmayabilir JVM memory de. Bilgisayar bilimlerinde "shared memory" diye bir konsept var, bazi seyleri birden fazla thread - process - hatta hardware ortak kullanabilir.


JVM de kendi icinde bu paterni kullanir, ozellikle de String gibi immutable objeler icin.

new String() yaptigin zaman JVM'e "Bana yeni obje olustur abicim, ortak kullanmak istemiyorum" diyorsun bir nevi. Bu da fazla memory kullanimi demek. Istelik yazmasi da okumasi da zor.
 
Senin dusundugun seyi de ben anlamadim.


Burda ne demek istedigin net degil.

Ama soyle daha basitce anlatayim; literal kullanimda her defasinda yeni obje yaratmayabilir JVM memory de. Bilgisayar bilimlerinde "shared memory" diye bir konsept var, bazi seyleri birden fazla thread - process - hatta hardware ortak kullanabilir.


JVM de kendi icinde bu paterni kullanir, ozellikle de String gibi immutable objeler icin.

new String() yaptigin zaman JVM'e "Bana yeni obje olustur abicim, ortak kullanmak istemiyorum" diyorsun bir nevi. Bu da fazla memory kullanimi demek. Istelik yazmasi da okumasi da zor.
Hocam benim anladığım:
String name = "bitwise"; denilince önce aynı değerde bir nesnenin olup olmadığına bakilir. Eger yoksa yeni bir nesne oluşturulur. Varsa var olan nesnenin referansı name degiskenine aktarılır.
Fakat String name = new String("bitwise"); dediğimizde hiçbir şey umrunda olmaz. Sadece nesneyi yaratır. Bu yüzden ayni değeri taşısalar bile birden fazla nesne oluşturulabilir.

Doğru mu?
Eğer doğruysa: Neden tek bir nesne oluşturulup her String ifade bir diziye aktarılmıyor? Hem nesne sayısı az olurdu.
 
Hocam benim anladığım:
String name = "bitwise"; denilince önce aynı değerde bir nesnenin olup olmadığına bakilir. Eger yoksa yeni bir nesne oluşturulur. Varsa var olan nesnenin referansı name degiskenine aktarılır.
Fakat String name = new String("bitwise"); dediğimizde hiçbir şey umrunda olmaz. Sadece nesneyi yaratır. Bu yüzden ayni değeri taşısalar bile birden fazla nesne oluşturulabilir.

Doğru mu?
Eğer doğruysa: Neden tek bir nesne oluşturulup her String ifade bir diziye aktarılmıyor? Hem nesne sayısı az olurdu.
Evet dogru.
Burada mesele obje sayisini az yapmaktan ziyade az memory kullanmak. Sen 14 bytelik String'i her defasinda yeniden olusturdugunda memory'den 14 byte tuketmeye devam edeceksin. Reuse edersen sadece 1 defa 14 bytelik yer allocate edeceksin. Garbage collection bunu toplayabilir de, toplamayabilir de.

Burada dizide tutmaktan kastettigin JVM in kendi icindeki memory yonetimi, o kendi icinde veriyi senin Java class'larinda yaptigin gibi yonetmiyor. JVM != Java.

String kendi icinde char[] array i tutuyor, JVM her string icin char malloc() cagiriyor.
Artik Java dunyasindan cikip JVM'in implementasyonuna giriyoruz ki her platform icin bu degiskenlik gosterebilir.

Ayrica senin teklif ettigin gibi dizi kullanmak da toplam obje sayisini dusurmez. 20 elemanli array en az 21 tane obje icerir. ( collection + internal collection + diger yardimci objeler ) Array ya da diger collectionlar da icindeki objelere referans tutuyorlar yalnizca.
 
Çözüm
Java Stringleri Flyweight Pattern kullanır.

Zaten nasıl çalıştığı önceki mesajlarda da detaylıca anlatılmış. Ek bilgi olarak; eğer new ile oluşturduğunu bir String varsa ve bunu havuzdaki bir String ile değiştirmek istiyorsanız intern() çağrısını yaparak bellekteki aynı nesneyi işaret etmesini sağlayabilirsiniz.

 

Yeni konular

Geri
Yukarı