Asyl: “” ýa-da konstruktor ulanyp, Java setirini dörediň? X Wang tarapyndan Java-da iki usul ulanyp bir setir döredilip bilner:
String x = "abc";
String y = new String("abc");
Jübüt sitatalar bilen konstruktor ulanmagyň arasynda näme tapawut bar?
1. Goşa sitatalar vs. Gurluşykçy
Bu soraga iki sany ýönekeý mysal seredip jogap berip bolar. Mysal 1:String a = "abcd";
String b = "abcd";
System.out.println(a == b); // True
System.out.println(a.equals(b)); // True
a==b
dogry, sebäbi a
ikisi-de b
şol bir obýekte degişlidir - usul meýdanynda göçme manyda (sözme-söz manyda) yglan edilen setir (okyjyny çeşmämiziň çeşmesine gönükdirýäris: Java düşünmek üçin iň gowy 8 diagramma , 8-nji diagramma). Şol bir setir göçme manyda birnäçe gezek döredilende, setiriň diňe bir nusgasy ýatda saklanýar, diňe bir mysal (biziň ýagdaýymyzda "abcd"). Muňa "setir interning" diýilýär. Kompil wagtynda işlenýän ähli setir yzygiderliligi Java-da awtomatiki usulda işleýär. Mysal 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
ýalňyş, sebäbi c
olar d
ýatda iki dürli jisimi aňladýar (üýşmekde). Dürli obýektleriň elmydama dürli salgylanmalary bar. Bu diagramma ýokarda beýan edilen iki ýagdaýy görkezýär:
2. Programmany ýerine ýetiriş tapgyrynda setir setirleri
Authorazyjy LukasEder-ä minnetdarlyk bildirýär (aşakdaky teswir onuňky): Setir interningi, konstruktorlaryň kömegi bilen iki setir döredilen hem bolsa, programma ýerine ýetirilende bolup biler: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. Jübüt sitatalary haçan we konstruktorlary haçan ulanmaly
Göçme manyda "abcd" -iň elmydama String görnüşine degişlidigi sebäpli, konstruktory ulanmak goşmaça zerur däl obýekt döreder. Şonuň üçin diňe bir setir döretmek zerur bolsa goşa sitatalar ulanylmaly. Aslynda üýşmekde täze bir zat döretmeli bolsaňyz, konstruktor ulanmaly. Ulanyş ýagdaýlary şu ýerde görkezilýär (asyl) . (Aşakda terjime edilen teksti hödürleýärin. Stillöne şonda-da şu baglanyşykdaky teswirçileriň kody bilen tanyşmagyňyzy maslahat berýärin.)JDK 6 we JDK 7-de substring () usuly
JDK 6 we JDK 7-de substring () usuly X Wang tarapyndan JDK 6 we JDK 7-de usulsubstring(int beginIndex, int endIndex)
başga. Bu tapawutlary bilmek, bu usuly has gowy ulanmaga kömek edip biler. Okamagyň aňsatlygy üçin aşakda substring()
doly sintaksisi göz öňünde tutarys. substring(int beginIndex, int endIndex)
.
1. Substring () näme edýär?
Usulsubstring(int beginIndex, int endIndex)
nyşan belgisinden başlanýan beginIndex
we nyşan belgisi bilen gutarýan setiri yzyna gaýtaryp berýär endIndex-1
.
String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);
Çykyş:
bc
2. Substring () diýlende näme bolýar?
Üýtgemezlik sebäpli, netijäni x belläninde düýbünden täze hatara yşarat edýändigini bilip bilersiňiz (x
diagramma serediň): Şeýle-de bolsa, bu diagramma düýbünden dogry däl; üýşmeleňde nämäniň bolup geçýändigini görkezmeýär. Aslynda diýilýän zat JDK 6 we JDK 7-de tapawutlanýar. x.substring(1,3)
x
substring()
3. JDK 6-da substring ()
Setir görnüşi massiw görnüşi bilen goldanýarchar
. JDK 6-da synpda String
3 meýdan bar : char value[]
,, int offset
. int count
Nyşanlaryň hakyky massiwini, massiwdäki birinji simwolyň görkezijisini, setirdäki nyşanlaryň sanyny saklamak üçin ulanylýar. Usul diýlende substring()
, täze hatar döredýär, ýöne üýtgeýjiniň bahasy henizem üýşmeleňdäki şol bir massiwi görkezýär. Iki setiriň arasyndaky tapawut, olaryň nyşanlaryň sany we massiwdäki başlangyç nyşanlaryň indeks bahasydyr. Aşakdaky kod ýönekeýleşdirildi we diňe meseläni görkezmek üçin esaslary öz içine alýar.
//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. JDK 6-da substring () sebäpli ýüze çykýan mesele
Eger gaty uzyn setir bar bolsa, ýöne her gezek ulananyňyzda diňe onuň kiçijik bölegi gereksubstring()
. Bu ýerine ýetiriş meselesine sebäp bolar, sebäbi size diňe kiçijik bir bölek gerek, ýöne şonda-da tutuş setiri saklamaly bolarsyňyz. JDK 6 üçin çözgüt aşakdaky kod bolup, setiri hakyky substringe geçirer:
x = x.substring(x, y) + ""
Ulanyjy STepeR bir sorag düzdi (teswirine serediň) we 4-nji nokady goşmak zerur ýalydy. "JDK 6-da ýüze çykan mesele substring()
" has giň mysal. Munuň jogaby bolar we beýlekileriň meseläniň nämedigini tiz anyklamagyna kömek eder diýip umyt edýärin. Ine kod:
String a = "aLongLongString";
String b = a.substring(1, 2);
String c = a.substring(2, 6);
Şeýlelik bilen, JDK 7-de b
, с
görnüşli görnüşdäki obýektde String
usuly çagyrmak arkaly döredilen görnüşli görnüşler, üýşmekde täze döredilen iki massiwi görkezer - üçin . Bu iki täze massiw, a bilen görkezilen asyl massiw bilen ALONG üýşmesinde saklanar . Bular. asyl massiw hiç ýerde ýitip gitmeýär. Indi JDK 6-a gaýdyp geleliň. JDK 6-da bir üýşmeleňde bir massiw bar . Kod setirleri ýerine ýetirilenden soň substring()
String
L
b
ongL
c
aLongLongString
aLongLongString
String b = a.substring(1, 2);
String c = a.substring(2, 6);
obýektler obýekte gabat gelýän üýşmeleňdäki şol bir massiwi aňladýar b
: - 1-nji indeksden 2-nji elemente, - 2-nji indeksden 6-a çenli elementlere (sanlar 0-dan başlaýar, ýatlatma). Bular. Elbetde, JDK 6-da üýtgeýjilere ýa-da c-leriň islendik elýeterliligi aslynda asyl massiwiň islenýän elementleriniň üýşmegine “sanalmagyna” sebäp bolar. JDK 7-de, üýtgeýjilere ýa-da c-leriň islendik elýeterliligi, eýýäm döredilen we üýşmeleňde “ýaşamak” üçin zerur bolan kiçijik massiwlere girmäge sebäp bolar. Bular. JDK 7-iň şuňa meňzeş ýagdaýlarda fiziki taýdan has köp ýady ulanýandygy aýdyňdyr. Aöne mümkin bir warianty göz öňüne getireliň: üýtgeýjiniň käbir aşaky bölekleri üýtgeýänlere bellenýär we geljekde her kim diňe olary ulanýar - obýektler we . Indi hiç kim üýtgeýjä girip bilmeýär, oňa salgylanma ýok (makalanyň awtory şuny aňladýar). Netijede, belli bir wagt hapa ýygnaýjy işe başlaýar we (iň umumy görnüşde, elbetde) 2 dürli ýagdaýy alýarys: JDK 6 : obýekt ýok edilýär (zibil ýygnalýar) , UTöne asyl ägirt uly massiw üýşmekde diri; yzygiderli ulanylýar we . JDK 7: bir obýekt üýşmeleňdäki asyl massiw bilen birlikde ýok edilýär. JDK 6-da ýadyň syzmagyna sebäp bolup biljek nokat. c
a
b
c
b
b
b
c
a
b
c
a
b
c
5. JDK 7-de substring ()
Usul JDK 7-de kämilleşdirildi. JDK 7-desubstring()
aslynda üýşmekde täze massiw döredýär.
//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