JavaRush /Блоги Java /Random-TG /Усули charAt() дар Java

Усули charAt() дар Java

Дар гурӯҳ нашр шудааст
Бисёр усулҳои асосӣ мавҷуданд, ки мо онҳоро мунтазам истифода намебарем, ҳатто дар бораи он фикр намекунем. Хуб, агар шумо дар ин бора фикр кунед ва бубинед, ки баъзе усулҳои ба назар содда чӣ гуна татбиқ карда мешаванд? Ман фикр мекунам, ки ин ба мо кӯмак мекунад, ки як қадам ба Java наздиктар шавем) charAt() дар Java - 1Биёед вазъиятеро тасаввур кунем, ки дар он мо бояд аломати муайянро дар ягон сатр истихроҷ кунем. Чӣ тавр мо инро дар 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

"зери кулоҳ" чист?

Чӣ тавр кор мекунад, шумо мепурсед? charAt() дар Java - 2Далели он аст, ки ҳар як an object Stringдорои массив 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.
Яъне, агар мо сатри "av"-ро созем, он дорои массив мешавад 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. Барои нав кардани дониши худ дар бораи амалиёти битвӣ, шумо метавонед ин мақоларо хонед . charAt() дар Java - 4Мо инчунин баъзе тағирёбандаҳоро мебинем: HI_BYTE_SHIFT дар ин ҳолат 0. LO_BYTE_SHIFTдар ин ҳолат 8. Дар сатри охирини ин усул:
  1. Элемент аз массиви арзиш гирифта мешавад ва HI_BYTE_SHIFTҳангоми афзоиш ба бит ба 0, яъне 0 иваз карда мешавад index +1.

    Дар мисоли сатри "абвг", byteи шашум - 51 - ҳамин тавр боқӣ мемонад, аммо дар айни замон индекс ба 7 меафзояд.

  2. Пас аз ин, элементи навбатии массив гирифта мешавад ва ба таври битӣ, вале бо LO_BYTE_SHIFT, яъне 8 бит иваз карда мешавад.

    Ва агар мо byteи 4 дошта бошем, ки тасвири дуӣ - 00000000 00000100 бошад, пас пас аз ба 8 бит гузаштан мо 00000100 00000000 дорем. Агар он адади бутун бошад - 1024.

  3. Минбаъд, барои ин ду арзиш амалиёти | (OR).

    Ва агар мо byteҳои 51 ва 1024 дошта бошем, ки дар тасвири дуӣ ба 00000000 00110011 ва 00000100 00000000 монанд буданд, пас пас аз амалиёт ORмо 00000100 00110011 мегирем, ки маънои рақами 1075-ро дорад.

    Хуб, дар охир рақами 1075 ба намуди char табдил дода мешавад ва ҳангоми табдил додани int -> char ҷадвали ASCII истифода мешавад ва дар он зери рақами 1075 аломати "g" мавҷуд аст.

Дар асл, ин аст, ки мо 'g' -ро дар натиҷаи усул charAt()дар барномасозии Java ба даст меорем.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION