JavaRush /Blog Jawa /Random-JV /Terjemahan: Nggawe obyek String ing Jawa - nggunakake " "...
FellowSparrow
tingkat
Lvov

Terjemahan: Nggawe obyek String ing Jawa - nggunakake " " utawa konstruktor?

Diterbitake ing grup
Original: Nggawe Java String Nggunakake " " utawa Konstruktor? Miturut X Wang Terjemahan: Nggawe Obyek String ing Jawa - PanganggoneIng Jawa, string bisa digawe nggunakake rong cara:
String x = "abc";
String y = new String("abc");
Apa bedane nggunakake kuotasi ganda lan nggunakake konstruktor?

1. Kutipan kaping pindho vs. Konstruktor

Pitakonan iki bisa dijawab kanthi ndeleng rong conto prasaja. Tuladha 1:
String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True
a==bbener amarga aloro-lorone bnuduhake obyek sing padha - senar sing diumumake minangka literal (senar literal ing ngisor iki) ing area metode (kita waca maca sumber ing sumber kita: Top 8 diagram kanggo pangerten Jawa , diagram 8). Nalika senar literal sing padha digawe luwih saka sapisan, mung siji salinan senar sing disimpen ing memori, mung siji conto (ing kasus kita "abcd"). Iki diarani "interning string". Kabeh konstanta string sing diproses ing wektu kompilasi kanthi otomatis diintern ing Jawa. Tuladha 2:
String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True
c==dpalsu amarga cpadha ddeleng rong obyek beda ing memori (ing numpuk). Objek sing beda mesthi duwe referensi sing beda. Diagram iki nggambarake rong kahanan ing ndhuwur: Terjemahan: Nggawe Obyek String ing Jawa - Panganggone

2. Interning strings ing tataran eksekusi program

Penulis matur nuwun LukasEder (komentar ing ngisor iki yaiku): String interning uga bisa kedadeyan sajrone eksekusi program, sanajan rong senar digawe nggunakake konstruktor:
String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

3. Nalika nggunakake kuotasi pindho lan nalika nggunakake konstruktor

Amarga kasunyatan manawa "abcd" harfiah tansah jinis String, nggunakake konstruktor bakal nggawe obyek tambahan sing ora perlu. Dadi kuotasi kaping pindho kudu digunakake yen sampeyan mung kudu nggawe senar. Yen sampeyan kudu nggawe obyek anyar ing tumpukan, sampeyan kudu nggunakake konstruktor. Kasus panggunaan ditampilake ing kene (asli) . (Aku nyedhiyakake teks terjemahan ing ngisor iki. Nanging aku isih menehi saran supaya sampeyan ngerti kode komentator ing tautan iki.)

Metode substring() ing JDK 6 lan JDK 7

Metode substring() ing JDK 6 lan JDK 7 Miturut X Wang Cara substring(int beginIndex, int endIndex)ing JDK 6 lan JDK 7 beda. Ngerti prabédan iki bisa mbantu sampeyan nggunakake cara iki luwih apik. Kanggo gampang maca, ing ngisor iki substring()bakal ditegesi sintaksis lengkap, yaiku. substring(int beginIndex, int endIndex).

1. Apa sing ditindakake substring()?

Cara kasebut substring(int beginIndex, int endIndex)ngasilake senar sing diwiwiti kanthi nomer karakter beginIndexlan diakhiri karo nomer karakter endIndex-1.
String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);
Output:
bc

2. Apa mengkono nalika substring () diarani?

Sampeyan bisa uga ngerti sing, amarga immutability x, nalika nemtokake x asil saka x.substring(1,3), xnuduhake baris rampung anyar (ndeleng diagram): Terjemahan: Nggawe Obyek String ing Jawa - PanganggoneNanging, diagram iki ora rampung bener; iku ora nduduhake apa bener arep ing numpuk. Apa sing kedadeyan nalika diarani substring()beda ing JDK 6 lan JDK 7.

3. substring() ing JDK 6

Jinis string didhukung dening jinis array char. Ing JDK 6, kelas kasebut Stringngemot 3 kolom: char value[], int offset, int count. Padha digunakake kanggo nyimpen Uploaded nyata karakter, indeks saka karakter pisanan ing Uploaded, nomer karakter ing baris. Nalika metode kasebut diarani substring(), nggawe baris anyar, nanging nilai variabel kasebut isih nuduhake array sing padha ing tumpukan. Bentenipun antarane rong senar yaiku jumlah karakter lan nilai indeks saka karakter wiwitan ing array. Terjemahan: Nggawe Obyek String ing Jawa - PanganggoneKode ing ngisor iki disederhanakake lan mung ngemot dhasar kanggo nduduhake masalah kasebut.
//JDK 6
String(int offset, int count, char value[]) {
	this.value = value;
	this.offset = offset;
	this.count = count;
}

public String substring(int beginIndex, int endIndex) {
	//check boundary
	return  new String(offset + beginIndex, endIndex - beginIndex, value);
}

4. Masalah sing disebabake dening substring() ing JDK 6

Yen sampeyan duwe senar VERY dawa, nanging sampeyan mung perlu bagean cilik saka iku, sing njaluk saben wektu nggunakake substring(). Iki bakal nyebabake masalah eksekusi, amarga sampeyan mung butuh bagean cilik, nanging sampeyan isih kudu nyimpen kabeh senar. Kanggo JDK 6, solusi kasebut yaiku kode ing ngisor iki, sing bakal ngirim string menyang substring nyata:
x = x.substring(x, y) + ""
Panganggo STepeR ngrumusake pitakonan (ndeleng komentare), lan kayane perlu nambah titik 4. "Masalah sing disebabake substring()ing JDK 6" minangka conto sing luwih akeh. Muga-muga iki bakal dadi jawaban lan bakal mbantu wong liya kanthi cepet ngerteni apa masalahe. Iki kode:
String a = "aLongLongString";
String b = a.substring(1, 2);
String c = a.substring(2, 6);
Dadi, ing JDK 7 b, obyek сsaka jinis a Stringdigawe dening nelpon cara substring()ing obyek saka jinis Stringbakal referensi loro array mentas digawe ing numpuk - Lkanggo b, ongLkanggo c. Iki loro susunan anyar bakal disimpen ing numpuk bebarengan karo Uploaded asli aLongLongStringreferensi dening a. Sing. Uploaded asli ora ilang ing ngendi wae. Saiki ayo bali menyang JDK 6. Ing JDK 6, tumpukan ngemot array tunggal aLongLongString. Sawise nglakokake baris kode
String b = a.substring(1, 2);
String c = a.substring(2, 6);
obyek bnuduhake cUploaded padha ing tumpukan, cocog kanggo obyek a: b- kanggo unsur saka indeks 1 kanggo 2, c- kanggo unsur saka indeks 2 kanggo 6 (nomer diwiwiti saka 0, pangeling). Sing. Temenan, akses liyane menyang variabel butawa c ing JDK 6 bakal nyebabake unsur sing dikarepake saka array asli "dietung" menyang tumpukan. Ing JDK 7, akses liyane menyang variabel butawa c bakal nyebabake akses menyang array cilik sing dibutuhake sing wis digawe lan "urip" ing tumpukan kasebut. Sing. Cetha JDK 7 nggunakake memori fisik luwih akeh ing kahanan kaya iki. Nanging ayo mbayangno pilihan sing bisa ditindakake: substrings tartamtu saka variabel ditugasake menyang variabel b, lan ing mangsa ngarep kabeh wong mung nggunakake - obyek lan . Ora ana sing mung ngakses variabel a maneh; ora ana referensi kanggo iku (iki tegese penulis artikel). Akibaté, ing sawetara titik ing wektu kolektor uwuh wis micu, lan (ing wangun paling umum, mesthi) kita njaluk 2 kahanan beda: JDK 6 : obyek wis numpes (sampah diklumpukake) , Nanging - Uploaded ageng asli ing tumpukan iku urip; iku terus digunakake lan . JDK 7: obyek a numpes bebarengan karo Uploaded asli ing numpuk. Iki minangka titik ing JDK 6 sing bisa nyebabake bocor memori. cabcabc

5. substring() ing JDK 7

Cara kasebut wis ditingkatake ing JDK 7. Ing JDK 7 substring()bener nggawe array anyar ing numpuk. Terjemahan: Nggawe Obyek String ing Jawa - Panganggone
//JDK 7
public String(char value[], int offset, int count) {
	//check boundary
	this.value = Arrays.copyOfRange(value, offset, offset + count);
}

public String substring(int beginIndex, int endIndex) {
	//check boundary
	int subLen = endIndex - beginIndex;
	return new String(value, beginIndex, subLen);
}
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION