Original: Nggawe Java String Nggunakake " " utawa Konstruktor? Miturut X Wang Ing 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==b
bener amarga a
loro-lorone b
nuduhake 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==d
palsu amarga c
padha d
deleng rong obyek beda ing memori (ing numpuk). Objek sing beda mesthi duwe referensi sing beda. Diagram iki nggambarake rong kahanan ing ndhuwur:
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 Carasubstring(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 kasebutsubstring(int beginIndex, int endIndex)
ngasilake senar sing diwiwiti kanthi nomer karakter beginIndex
lan 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 immutabilityx
, nalika nemtokake x asil saka x.substring(1,3)
, x
nuduhake baris rampung anyar (ndeleng diagram): Nanging, 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 arraychar
. Ing JDK 6, kelas kasebut String
ngemot 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. Kode 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 nggunakakesubstring()
. 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 String
digawe dening nelpon cara substring()
ing obyek saka jinis String
bakal referensi loro array mentas digawe ing numpuk - L
kanggo b
, ongL
kanggo c
. Iki loro susunan anyar bakal disimpen ing numpuk bebarengan karo Uploaded asli aLongLongString
referensi 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 b
nuduhake c
Uploaded 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 b
utawa c ing JDK 6 bakal nyebabake unsur sing dikarepake saka array asli "dietung" menyang tumpukan. Ing JDK 7, akses liyane menyang variabel b
utawa 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. c
a
b
c
a
b
c
5. substring() ing JDK 7
Cara kasebut wis ditingkatake ing JDK 7. Ing JDK 7substring()
bener nggawe array anyar ing numpuk.
//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);
}
GO TO FULL VERSION