JavaRush /Блоги Java /Random-TG /Тарҷума: Эҷоди объектҳои сатр дар Java - бо истифода аз "...
FellowSparrow
Сатҳи
Lvov

Тарҷума: Эҷоди объектҳои сатр дар Java - бо истифода аз " " ё созанда?

Дар гурӯҳ нашр шудааст
Асл: Бо истифода аз “ ” ё Конструктор сатри Java эҷод кунед? Бо X Wang Тарҷума: Эҷоди an objectҳои сатр дар Java - Истифодадар Java сатрро бо ду усул сохтан мумкин аст:
String x = "abc";
String y = new String("abc");
Фарқи байни истифодаи нохунакҳои дукарата ва истифодаи конструктор чӣ гуна аст?

1. Иқтибосҳои дукарата против. Конструктор

Ба ин савол бо дидани ду мисоли оддӣ ҷавоб додан мумкин аст. Мисол 1:
String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True
a==bдуруст аст, зеро aҳардуи онҳо bба як an object ишора мекунанд - сатре, ки ҳамчун литерал (сатри аслӣ дар зер) дар минтақаи усул эълон шудааст (мо хонандаро ба манбаи манбаи худ муроҷиат мекунем: Диаграммаҳои беҳтарини 8 барои фаҳмидани Java , диаграммаи 8). Вақте ки як сатри литерали зиёда аз як маротиба сохта мешавад, танҳо як нусхаи сатр дар хотира нигоҳ дошта мешавад, танҳо як намунаи он (дар ҳолати мо "abcd"). Инро "интернинг стринг" меноманд. Ҳама константаҳои сатри дар вақти компилясия коркардшуда ба таври худкор дар Java дохил карда мешаванд. Мисоли 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бардурӯғ, зеро cонҳо dба ду an objectи гуногун дар хотира (дар теппа) ишора мекунанд. Объектҳои гуногун ҳамеша истинодҳои гуногун доранд. Ин диаграмма ду ҳолати дар боло тавсифшударо нишон медиҳад: Тарҷума: Эҷоди an objectҳои сатр дар Java - Истифода

2. Сатрҳои интернинг дар марҳилаи иҷрои барнома

Муаллиф ба LukasEder изҳори сипос мекунад (шарҳи зер аз они ӯ аст): Интернинги сатр инчунин метавонад ҳангоми иҷрои барнома рух диҳад, ҳатто агар ду сатр бо истифода аз конструкторҳо сохта шуда бошад:
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. Кай истифода бурдани нохунакхои дукарата ва кай конструкторхоро истифода бурдан лозим аст

Аз сабаби он, ки калимаи аслии "abcd" ҳамеша навъи String аст, истифодаи конструктор an objectи иловагии нолозимро эҷод мекунад. Пас, нохунакҳои дукарата бояд истифода шаванд, агар шумо танҳо як сатр эҷод кунед. Агар ба шумо воқеан лозим аст, ки дар теппа an objectи нав эҷод кунед, шумо бояд конструкторро истифода баред. Ҳолатҳои истифода дар ин ҷо нишон дода шудаанд (аслӣ) . (Ман матни тарҷумашударо дар зер пешниҳод мекунам. Аммо ман ба ҳар ҳол тавсия медиҳам, ки шумо бо рамзи шарҳдиҳандагон дар ин пайванд шинос шавед.)

Усули substring() дар JDK 6 ва JDK 7

Усули substring() дар JDK 6 ва JDK 7 By X Wang Усул substring(int beginIndex, int endIndex)дар JDK 6 ва JDK 7 гуногун аст. Донистани ин фарқиятҳо метавонад ба шумо кӯмак кунад, ки ин усулро беҳтар истифода баред. Барои осонии хондан, дар зер substring()мо синтаксиси пурраро дар назар дорем, яъне. substring(int beginIndex, int endIndex).

1. Substring() чӣ кор мекунад?

Ин усул substring(int beginIndex, int endIndex)сатрро бармегардонад, ки бо рақами аломат оғоз мешавад beginIndexва бо рақами аломат анҷом меёбад endIndex-1.
String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);
Натиҷа:
bc

2. Вақте ки substring() даъват мешавад, чӣ мешавад?

Шумо шояд бидонед, ки аз сабаби тағирнопазир будан xҳангоми таъин кардани x натиҷаи x.substring(1,3), xон ба сатри комилан нав ишора мекунад (ба диаграмма нигаред): Тарҷума: Эҷоди an objectҳои сатр дар Java - ИстифодаАммо, ин диаграмма комилан дуруст нест; он нишон намедиҳад, ки воқеан дар тӯда чӣ рӯй дода истодааст. substring()Дар JDK 6 ва JDK 7 чӣ воқеа рӯй медиҳад, вақте ки даъват мешавад, фарқ мекунад.

3. substring() дар JDK 6

Навъи сатр бо навъи массив дастгирӣ карда мешавад char. Дар JDK 6 синф Stringаз 3 майдон иборат аст: char value[], int offset, int count. Онҳо барои нигоҳ доштани массиви воқеии аломатҳо, индекси аломати аввал дар массив, шумораи аломатҳои сатр истифода мешаванд. Вақте ки усул даъват карда мешавад substring(), он сатри нав эҷод мекунад, аммо арзиши тағирёбанда ба ҳамон массив дар теппа ишора мекунад. Фарқи байни ду сатр шумораи аломатҳои онҳо ва арзиши индекси аломати ибтидоӣ дар массив мебошад. Тарҷума: Эҷоди an objectҳои сатр дар Java - ИстифодаРамзи дар поён овардашуда содда карда шудааст ва танҳо барои нишон додани мушкилот асосҳоро дар бар мегирад.
//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. Мушкилоте, ки тавассути substring() дар JDK 6 ба вуҷуд омадааст

Агар шумо сатри ХЕЛЕ дароз дошта бошед, аммо ба шумо танҳо як қисми хурди он лозим аст, ки ҳар дафъа бо истифода аз substring(). Ин боиси мушкилоти иҷро мегардад, зеро ба шумо танҳо як қисми хурд лозим аст, аммо шумо ба ҳар ҳол бояд тамоми сатрро нигоҳ доред. Барои JDK 6, ҳалли ин codeи зер аст, ки сатрро ба зерсатри воқеӣ интиқол медиҳад:
x = x.substring(x, y) + ""
Корбар STepeR саволе таҳия кард (ба шарҳи ӯ нигаред) ва илова кардани банди 4 зарур ба назар мерасид. "Мушкилоте, ки substring()дар JDK 6 ба вуҷуд омадааст" як мисоли васеътар аст. Ман умедворам, ки ин ҷавоб хоҳад буд ва ба дигарон кӯмак мекунад, ки мушкилотро зуд фаҳманд. Ин аст code:
String a = "aLongLongString";
String b = a.substring(1, 2);
String c = a.substring(2, 6);
Ҳамин тавр, дар JDK 7 b, an objectҳои снавъи a String, ки бо даъвати метод substring()дар an objectи навъи a сохта шудаанд String, ба ду массиви навтаъсис дар теппа - Lfor b, ongLfor истинод мекунанд c. Ин ду массиви нав дар теппаи БАРҶОМ бо массиви аслӣ, ки aLongLongStringаз ҷониби a истинод шудааст, нигоҳ дошта мешаванд. Онхое. массиви аслӣ дар ҳеҷ куҷо нест намешавад. Акнун биёед ба JDK 6 баргардем. Дар JDK 6 теппа як массиви ягона дорад aLongLongString. Пас аз иҷрои сатрҳои code
String b = a.substring(1, 2);
String c = a.substring(2, 6);
an objectҳо ба як массиви дар теппа мувофиқат bмекунанд , ки ба an object мувофиқ аст : - ба элементҳо аз индекси 1 то 2, - ба элементҳо аз индекси 2 то 6 (рақамгузорӣ аз 0 оғоз мешавад, ёдраскунӣ). Онхое. Аён аст, ки ҳама гуна дастрасии минбаъда ба тағирёбандаҳо ё c дар JDK 6 воқеан ба он оварда мерасонад, ки унсурҳои дилхоҳи массиви аслӣ ба тӯда “ҳисоб карда мешаванд”. Дар JDK 7, ҳама гуна дастрасии минбаъда ба тағирёбандаҳо ё c боиси дастрасӣ ба массивҳои зарурии хурдтаре мегардад, ки аллакай сохта шудаанд ва дар теппа “зиндагӣ” мекунанд. Онхое. Равшан аст, ки JDK 7 дар чунин ҳолатҳо хотираи ҷисмониро бештар истифода мебарад. Аммо биёед як варианти имконпазирро тасаввур кунем: зерсатрҳои муайяни тағирёбанда ба тағирёбандаҳо таъин карда мешаванд ва дар оянда ҳама танҳо онҳоро истифода мебаранд - an objectҳо ва . Ҳеҷ кас дигар танҳо ба тағирёбандаи a дастрасӣ надорад; ягон истинод ба он вуҷуд надорад (ин маъно дорад муаллифи мақола). Дар натиҷа, дар як лаҳза коллектори ахлот ба кор андохта мешавад ва (дар шакли умумӣ, албатта) мо 2 ҳолати гуногунро ба даст меорем: JDK 6 : an object нобуд карда мешавад (партовҳо ҷамъоварӣ карда мешаванд) , ВАЛЕ - массиви бузурги аслии дар теппа зинда аст; доимо истифода бурда мешавад ва . JDK 7: an objectи a дар якҷоягӣ бо массиви аслӣ дар теппа нест карда мешавад. Ин нукта дар JDK 6 аст, ки метавонад ба ихроҷи хотира оварда расонад. cabcbbbcabcabc

5. substring() дар JDK 7

Ин усул дар JDK 7 такмил дода шудааст. Дар JDK 7 substring()он воқеан дар теппа массиви нав эҷод мекунад. Тарҷума: Эҷоди an objectҳои сатр дар Java - Истифода
//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);
}
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION