JavaRush /Java Blog /Random-TK /Terjime: Java-da setir obýektleri döretmek - "" ýa-da kon...
FellowSparrow
Dereje
Lvov

Terjime: Java-da setir obýektleri döretmek - "" ýa-da konstruktor ulanyp?

Toparda çap edildi
Asyl: “” ýa-da konstruktor ulanyp, Java setirini dörediň? X Wang tarapyndan Terjime: Java-da setir obýektleri döretmek - Ulanyş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==bdogry, sebäbi aikisi-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 colar 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: Terjime: Java-da setir obýektleri döretmek - Ulanyş

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 usul substring(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?

Usul substring(int beginIndex, int endIndex)nyşan belgisinden başlanýan beginIndexwe 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 ( xdiagramma 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)xTerjime: Java-da setir obýektleri döretmek - Ulanyşsubstring()

3. JDK 6-da substring ()

Setir görnüşi massiw görnüşi bilen goldanýar char. JDK 6-da synpda String3 meýdan bar : char value[],, int offset. int countNyş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. Terjime: Java-da setir obýektleri döretmek - Ulanyş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 gerek substring(). 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 Stringusuly ç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()StringLbongLcaLongLongStringaLongLongString
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. cabcbbbcabcabc

5. JDK 7-de substring ()

Usul JDK 7-de kämilleşdirildi. JDK 7-de substring()aslynda üýşmekde täze massiw döredýär. Terjime: Java-da setir obýektleri döretmek - Ulanyş
//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);
}
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION