JavaRush /Java Blog /Random-TK /Java-da charAt () usuly

Java-da charAt () usuly

Toparda çap edildi
Bu hakda pikirem etmän yzygiderli ulanýan köp usullarymyz bar. Garaz, bu hakda pikirlenip, ýönekeý ýaly görünýän usullaryň nähili durmuşa geçirilýändigine seretseňiz näme bolar? Bu Java-a bir ädim ýakynlaşmaga kömek eder diýip pikir edýärin) Java-da charAt () - 1Geliň, haýsydyr bir setirde belli bir nyşan çykarmaly ýagdaýy göz öňüne getireliň. Muny Java-da nädip edip bileris? Mysal üçin, jaň etmek bilen Java String charAt. Usul barada şu günki makalamyzda charAt()gürleşeris .

Sintaksis

char charAt(int index)görkezilen indeksde zarýad bahasyny görkezýär. Indeks 0 bilen üýtgeýär length()-1. .Agny, charyzygiderliligiň birinji bahasy , indeks indeksinde bolşy ýaly, index 0indiki we ş.m.index 1

Mysal

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));
}
Birinji setir birinji harpy, ikinji setir ikinji belgini alýar we ş.m. Notok println, ýöne şu ýerde ulanylýar print, täze setir bolmazdan, konsola aşakdaky çykyşy alarys:

Java
Berlen indeks Unicode hökmünde görkezilse char, usulyň netijesi java charAt()şu icunikody görkezýän nyşan bolar:
System.out.println("J\u0061vaRush".charAt(1));
Konsol çykyşy:

a

"Kapotyň aşagy" näme?

Bu nähili işleýär? Java-da charAt ()Hakykat, her bir obýektde berlen setir elementleriniň baýtlary bolan Stringbir massiw bar :byte
private final byte[] value;
Ine, usulyň özi chatAt:
public char charAt(int index) {
   if (isLatin1()) {
       return StringLatin1.charAt(value, index);
   } else {
       return StringUTF16.charAt(value, index);
   }
}
isLatin1- setirimizde diňe latyn nyşanlarynyň bardygyny ýa-da ýokdugyny görkezýän baýdak. Indiki haýsy usulyň atlandyryljakdygyny kesgitleýär.

isLatin1 = dogry

Setirde diňe latyn harplary bar bolsa, statiki charAtsynp usuly diýilýär StringLatin1:
public static char charAt(byte[] value, int index) {
   if (index < 0 || index >= value.length) {
       throw new StringIndexOutOfBoundsException(index);
   }
   return (char)(value[index] & 0xff);
}
Birinji ädim, gelýän indeksiň 0-dan ulydygyny ýa-da deňdigini, içerki baýt massiwinden çykmaýandygyny barlamakdyr we bu beýle bolmasa, kadadan çykma bolýar new StringIndexOutOfBoundsException(index). Barlaglar geçse, bize zerur element alynýar. Ahyrynda görýäris:
  • &ikilik operasiýasy üçin bytebirneme uzalýar
  • 0xff&jedel talap etmekden başga zat etmeýär
  • (char)maglumatlary ASCII tablisasyndan öwürýärchar

isLatin1 = ýalan

Bizde diňe latyn harplary däl bolsa, synp ulanylar StringUTF16we statiki usuly şeýle atlandyrylar:
public static char charAt(byte[] value, int index) {
   checkIndex(index, value);
   return getChar(value, index);
}
Öz gezeginde jaň edýär:
public static void checkIndex(int off, byte[] val) {
   String.checkIndex(off, length(val));
}
Statik usula wekilçilik edýär String:
static void checkIndex(int index, int length) {
   if (index < 0 || index >= length) {
       throw new StringIndexOutOfBoundsException("index " + index +
                                                 ", length " + length);
   }
}
Aslynda, bu ýerde indeksiň dogrudygyny ýa-da ýokdugyny, polo positiveitel ýa-da noldygyny ýa-da massiwiň çäginden çykmandygyny barlamak üçin barlag geçirilýär. StringUTF16Emma usulda bir synpda charAtikinji usuly çagyrmak has gyzykly bolar:
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));
}
Geliň, bu ýerde hakykatda nämeleriň bolup geçýändigini analiz edip başlalyň. Usulyň başyndaky ilkinji ädim indeksiň dogrulygyny barlamakdyr. Ondan soň nämeleriň boljakdygyna düşünmek üçin düşünmeli: latyn däl nyşan massiwiň içine girende value, iki baýt (iki massiw öýjügi) bilen aňladylýar. Iki sany kiril simwoly bar bolsa - “av”, onda:
  • 'a' üçin bu jübüt baýt - 48 we 4;
  • 'in' üçin - 50 we 4.
Avagny, “av” setirini döretsek, onda bir massiw bolar value- {48, 4, 50, 4} Aslynda bu usul iki massiw öýjügi bilen işleýär value. Şonuň üçin indiki ädim, index <<= 1;massiwde islenýän nyşanlaryň birinji baýtynyň indeksine gönüden-göni geçmekdir value. Indi setirimiz bar diýeliň "абвг". Soňra baha massiwi şeýle bolar: {48, 4, 49, 4, 50, 4, 51, 4}. Setiriň üçünji elementini soraýarys, soň ikilik görnüşi 00000000 00000011 bolýar. 1 üýtgedilende 00000000 00000110 alarys index = 6. Bitwise amallary barada bilimleriňizi täzelemek üçin bu makalany okap bilersiňiz . Java-da charAt ()Käbir üýtgeýjileri hem görýäris: HI_BYTE_SHIFT bu ýagdaýda 0 bolýar, LO_BYTE_SHIFTbu ýagdaýda 8 bolýar. Bu usulyň soňky setirinde:
  1. Bir element baha massiwinden alynýar we HI_BYTE_SHIFTulalýarka 0 bilen üýtgedilýär index +1.

    Setir bilen mysalda "абвг", altynjy baýt - 51 - şeýle galar, ýöne şol bir wagtyň özünde indeks 7-e çenli ýokarlanýar.

  2. Ondan soň, massiwiň indiki elementi edil şol bir görnüşde alnyp gidilýär we LO_BYTE_SHIFT, ýagny 8 bit bilen üýtgedilýär.

    Ikitaraplaýyn görnüşi bolan 00000000 00000100 bolan 4 baýt bar bolsa, 8 bit bilen üýtgedilenden soň 00000100 00000000 bolar. Eger bitewi san bolsa - 1024.

  3. Ondan soň, bu iki baha üçin amal ýerine ýetirilýär | (OR).

    Ikitaraplaýyn görnüşde 00000000 00110011 we 00000100 00000000 ýaly görünýän 51 we 1024 baýtlarymyz bar bolsa, amaldan soň OR00000100 00110011 alarys, bu onluk ulgamdaky 1075 belgisini aňladýar.

    Netijede, 1075 belgisi char görnüşine öwrülýär we int -> char öwrülende ASCII tablisasy ulanylýar we 1075 belgisiniň aşagynda 'r' harpy bar.

charAt()Aslynda, Java programmirleme usulynyň netijesi hökmünde 'g' alýarys .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION