Асл: Бо истифода аз “ ” ё Конструктор сатри Java эҷод кунед? Бо X Wang дар 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и гуногун дар хотира (дар теппа) ишора мекунанд. Объектҳои гуногун ҳамеша истинодҳои гуногун доранд. Ин диаграмма ду ҳолати дар боло тавсифшударо нишон медиҳад:
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
он ба сатри комилан нав ишора мекунад (ба диаграмма нигаред): Аммо, ин диаграмма комилан дуруст нест; он нишон намедиҳад, ки воқеан дар тӯда чӣ рӯй дода истодааст. substring()
Дар JDK 6 ва JDK 7 чӣ воқеа рӯй медиҳад, вақте ки даъват мешавад, фарқ мекунад.
3. substring() дар JDK 6
Навъи сатр бо навъи массив дастгирӣ карда мешавадchar
. Дар JDK 6 синф String
аз 3 майдон иборат аст: char value[]
, int offset
, int count
. Онҳо барои нигоҳ доштани массиви воқеии аломатҳо, индекси аломати аввал дар массив, шумораи аломатҳои сатр истифода мешаванд. Вақте ки усул даъват карда мешавад substring()
, он сатри нав эҷод мекунад, аммо арзиши тағирёбанда ба ҳамон массив дар теппа ишора мекунад. Фарқи байни ду сатр шумораи аломатҳои онҳо ва арзиши индекси аломати ибтидоӣ дар массив мебошад. Рамзи дар поён овардашуда содда карда шудааст ва танҳо барои нишон додани мушкилот асосҳоро дар бар мегирад.
//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
, ба ду массиви навтаъсис дар теппа - L
for b
, ongL
for истинод мекунанд 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 аст, ки метавонад ба ихроҷи хотира оварда расонад. c
a
b
c
b
b
b
c
a
b
c
a
b
c
5. substring() дар JDK 7
Ин усул дар JDK 7 такмил дода шудааст. Дар JDK 7substring()
он воқеан дар теппа массиви нав эҷод мекунад.
//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