Бисёр усулҳои асосӣ мавҷуданд, ки мо онҳоро мунтазам истифода намебарем, ҳатто дар бораи он фикр намекунем. Хуб, агар шумо дар ин бора фикр кунед ва бубинед, ки баъзе усулҳои ба назар содда чӣ гуна татбиқ карда мешаванд? Ман фикр мекунам, ки ин ба мо кӯмак мекунад, ки як қадам ба Java наздиктар шавем) Биёед вазъиятеро тасаввур кунем, ки дар он мо бояд аломати муайянро дар ягон сатр истихроҷ кунем. Чӣ тавр мо инро дар Java иҷро карда метавонем? Масалан, бо занг задан ба
Java String charAt
. charAt()
Мо дар бораи усул дар мақолаи имрӯза сӯҳбат хоҳем кард.
Синтаксис
char charAt(int index)
арзиши charро дар индекси муайяншуда бармегардонад. Индекс аз 0 то length()-1
. Яъне, char
арзиши якуми пайдарпаӣ дар index 0
, навбатӣ дар , index 1
ва ғайра аст, чуноне ки дар индексатсияи массив аст.
Мисол
public static void main(String[] args) {
System.out.print("JavaRush".charAt(0));
System.out.print("JavaRush".charAt(1));
System.out.print("JavaRush".charAt(2));
System.out.print("JavaRush".charAt(3));
}
Сатри якум аломати якумро мегирад, сатри дуюм дуюмро мегирад ва ғайра. Азбаски не println
, балки дар ин ҷо истифода мешавад print
, бидуни хати нав, мо баромади зеринро ба консол мегирем:
Java
Агар char
индекси додашуда ҳамчун Юниcode муаррифӣ шавад, натиҷаи усул java charAt()
аломате хоҳад буд, ки ин Юниcodeро ифода мекунад:
System.out.println("J\u0061vaRush".charAt(1));
Натиҷаи консол:
a
"зери кулоҳ" чист?
Чӣ тавр кор мекунад, шумо мепурсед? Далели он аст, ки ҳар як an objectString
дорои массив byte
бо byteҳои элементҳои сатри додашуда мебошад:
private final byte[] value;
Ва ин аст худи усул chatAt
:
public char charAt(int index) {
if (isLatin1()) {
return StringLatin1.charAt(value, index);
} else {
return StringUTF16.charAt(value, index);
}
}
isLatin1
- парчам, ки нишон медиҳад, ки сатри мо танҳо аломатҳои лотинӣ дорад ё не. Ин муайян мекунад, ки кадом усул дар оянда даъват карда мешавад.
isLatin1 = ҳақиқӣ
Агар сатр танҳо аломатҳои лотинӣ дошта бошад, усулиcharAt
синфи статикӣ номида мешавад StringLatin1
:
public static char charAt(byte[] value, int index) {
if (index < 0 || index >= value.length) {
throw new StringIndexOutOfBoundsException(index);
}
return (char)(value[index] & 0xff);
}
Қадами аввал санҷидани он аст, ки индекси воридотӣ аз 0 зиёд ё баробар аст ва он аз доираи массиви byteҳои дохилӣ берун намеравад ва агар ин тавр набошад, истисно партофта мешавад new StringIndexOutOfBoundsException(index)
. Агар чекҳо гузашта бошанд, он гоҳ элементе, ки ба мо лозим аст, гирифта мешавад. Дар охир мебинем:
&
барои амалиёти бинарӣ баbyte
бит васеъ мекунад0xff
гайр аз&
бахс талаб кардан коре намекунад(char)
маълумотро аз ҷадвали ASCII баchar
isLatin1 = бардурӯғ
Агар мо бештар аз ҳарфҳои лотинӣ дошта бошем, синф истифода мешавадStringUTF16
ва усули статикии он номида мешавад:
public static char charAt(byte[] value, int index) {
checkIndex(index, value);
return getChar(value, index);
}
Ки дар навбати худ даъват мекунад:
public static void checkIndex(int off, byte[] val) {
String.checkIndex(off, length(val));
}
Ва ӯ ба усули статикӣ вакил мекунад String
:
static void checkIndex(int index, int length) {
if (index < 0 || index >= length) {
throw new StringIndexOutOfBoundsException("index " + index +
", length " + length);
}
}
Дар ин ҷо, воқеан, тафтиш карда мешавад, ки оё индекс дуруст аст: боз ҳам мусбат ё сифр аст ва оё он аз ҳудуди массив берун нарафтааст. Аммо дар синф StringUTF16
дар метод, charAt
даъват кардани усули дуюм ҷолибтар хоҳад буд:
static char getChar(byte[] val, int index) {
assert index >= 0 && index < length(val) : "Trusted caller missed bounds check";
index <<= 1;
return (char)(((val[index++] & 0xff) << HI_BYTE_SHIFT) |
((val[index] & 0xff) << LO_BYTE_SHIFT));
}
Биёед ба таҳлor он чизе, ки воқеан дар ин ҷо рӯй дода истодааст, оғоз кунем. Қадами аввал дар оғози усул боз як санҷиши дурустии индекс мебошад. Барои фаҳмидани чӣ ҳодиса рӯй медиҳад, шумо бояд фаҳмед: вақте ки аломати ғайрилотинӣ ба массив ворид мешавад value
, он бо ду byte (ду ячейкаи массив) ифода карда мешавад. Агар мо сатри ду аломати кириллӣ дошта бошем - "av", пас:
- барои «а» ин як ҷуфт byte - 48 ва 4;
- барои «дар» — 50 ва 4.
value
- {48, 4, 50, 4} Воқеан, ин усул бо ду ячейкаи массив кор мекунад value
. Аз ин рӯ, қадами навбатӣ ин гузариш аст, index <<= 1;
ки бевосита ба индекси byteи якуми аломати дилхоҳ дар массив ворид шавад value
. Акнун биёед бигӯем, ки мо сатр дорем "абвг"
. Он гоҳ массиви арзишҳо чунин хоҳад буд: {48, 4, 49, 4, 50, 4, 51, 4}. Мо элементи сеюми сатрро талаб мекунем ва баъд намояндагии дуӣ 00000000 00000011 аст. Ҳангоми ба 1 гузаштан 00000000 00000110, яъне index = 6
. Барои нав кардани дониши худ дар бораи амалиёти битвӣ, шумо метавонед ин мақоларо хонед . Мо инчунин баъзе тағирёбандаҳоро мебинем: HI_BYTE_SHIFT
дар ин ҳолат 0. LO_BYTE_SHIFT
дар ин ҳолат 8. Дар сатри охирини ин усул:
- Элемент аз массиви арзиш гирифта мешавад ва
HI_BYTE_SHIFT
ҳангоми афзоиш ба бит ба 0, яъне 0 иваз карда мешавадindex +1
.Дар мисоли сатри
"абвг"
, byteи шашум - 51 - ҳамин тавр боқӣ мемонад, аммо дар айни замон индекс ба 7 меафзояд. - Пас аз ин, элементи навбатии массив гирифта мешавад ва ба таври битӣ, вале бо LO_BYTE_SHIFT, яъне 8 бит иваз карда мешавад.
Ва агар мо byteи 4 дошта бошем, ки тасвири дуӣ - 00000000 00000100 бошад, пас пас аз ба 8 бит гузаштан мо 00000100 00000000 дорем. Агар он адади бутун бошад - 1024.
- Минбаъд, барои ин ду арзиш амалиёти
| (OR)
.Ва агар мо byteҳои 51 ва 1024 дошта бошем, ки дар тасвири дуӣ ба 00000000 00110011 ва 00000100 00000000 монанд буданд, пас пас аз амалиёт
OR
мо 00000100 00110011 мегирем, ки маънои рақами 1075-ро дорад.Хуб, дар охир рақами 1075 ба намуди char табдил дода мешавад ва ҳангоми табдил додани int -> char ҷадвали ASCII истифода мешавад ва дар он зери рақами 1075 аломати "g" мавҷуд аст.
charAt()
дар барномасозии Java ба даст меорем.
GO TO FULL VERSION