Sətirlərin string hovuzu, yeni bir obyektin (yeni bir söz ilə) başlanması və normal dizəyin başlanğıcı?

 String s1 = new String("abc"); String s2 = "abc"; 

s1 də iki obyekt yaradılır: biri həndəsi havuzda və bir hovuzda yaddaşda.

s2 -də, sıra hovuzunda yalnız bir obyekt yaradılacaq.

Bunu edərsənsə:

 s1.concat("def"); s2.concat("def"); 

İndi simli hovuzda ( "abc" , "def""abcdef" ) 3 obyekt var, onlardan ikisi ( "def""abcdef" ) "abcdef" "abc" tərk edir.

Hər iki bağlantı da sıra havuzu obyektinə aiddir.

Yaddaş obyektinin əhəmiyyəti nədir?

-15
12 мая '15 в 9:37 2015-05-12 09:37 Purvender Hooda 12 may, saat 15: 00-da təyin olunub 2015-05-12 09:37
@ 2 cavablar

s2 -də, sıra hovuzunda yalnız bir obyekt yaradılacaq.

Əslində, bu xətt yeni obyektlər yaratmayacaq. s2 , s1 qurmaq üçün istifadə edilən eyni sabitliyə istinad olacaq.

İndi simli hovuzda ( "abc" , "def""abcdef" ) 3 obyekt var, onlardan ikisi ( "def""abcdef" ) "abcdef" "abc" tərk edir.

Xeyr, yalnız "abc""def" daimi hovuzdadır və sabit olduqları üçün proqramın müddətində yaddaşda qalacaqlar. "abcdef" sonra dərhal zibil toplayacaq, çünki heç yerdə saxlanmır.

String.concat() əvəzinə + operatorunu istifadə String.concat() , kompilyator həqiqətən iki sabit simli birini birinə birləşdirəcək və hovuzdakı nəticəni yalnız saxlaya bilər.

Hər iki bağlantı da sıra havuzu obyektinə aiddir.

Xeyr, yalnız s2 sabit hovuzdakı bir .concat() və heç bir .concat() nəticə daimi hovuzda olacaq.

Yaddaş obyektinin əhəmiyyəti nədir?

Sütun sabitlərinin havuzunun nöqtəsi nədir? Əslində, bu, birbaşa birdən çox nümunələri yaratmaqdan ötrü eyni istinaddan istifadə etmək üçün sabitləri (məsələn, kodunuzdakı xətləri) təmin edən bir optimallaşdırmadır. Sabit olduğundan bu kompilyasiya müddətində, iş vaxtında yer və vaxt. Bu, açıq bir şəkildə zəng .intern() , strings, .intern() tətbiq edilmir, ancaq adətən bunu qarşısını almaq lazımdır .

Ayrıca ilginizi çekebilir Java dizgelerinin kalıcı bir havuzu nerede yaşanır, yığın ya da yığın var?


Değişiklik: Çünkü "abcdef" bir hissəsinin bir hissəsi olacağını təkid "abcdef" , burada belə deyil:

 $ javac -version javac 1.7.0_02 $ cat Test.java public class Test { public static void main(String[] args) { String s1 = "123" + "456"; String s2 = "abc".concat("def"); } } $ javac Test.java $ javap -c -classpath . Test Compiled from "Test.java" public class Test { public Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/> 

Gördüyünüz kimi, strings 123456 , abcdef sabitlərdir ( ldc bax) və String.concat() run vaxtında çağırılır.

4
12 мая '15 в 10:01 2015-05-12 10:01 cavab dimo414 12 may, saat 15: 00-da verilir 2015-05-12 10:01

s1.concat("def");s2.concat("def"); iş vaxtında baş verər, onlar daimi hovuzun bir hissəsi olmayacaq, bir yığın halına düşürlər.

concat imzanı qeyd edin:

 public String concat(String str) 
border=0

yeni bir simli qaytarır və hər hansı bir dəyişənə bu simli təyin etmirsiniz.

Yaddaş obyektinin əhəmiyyəti nədir?

Nə soruşduğunuz aydın deyil, ancaq qeyd edək ki, concat tərəfindən yaradılan xətt təyin edilmir (linklər atılır), zibil toplanması üçün uyğun olacaq.

2
12 мая '15 в 9:45 2015-05-12 09:45 Cavab Maroun tərəfindən 12 may, saat 15: 00-da 2015-05-12 09:45

tags ilə bağlı digər suallar və ya sual