JavaRush /Blog Jawa /Random-JV /charAt() ing Jawa

charAt() ing Jawa

Diterbitake ing grup
Ana akeh teknik dhasar sing digunakake kanthi rutin tanpa dipikirake. Inggih, apa yen sampeyan mikir babagan iki lan ndeleng carane sawetara cara sing gampang ditindakake? Aku iki bakal mbantu kita njaluk siji langkah nyedhaki Jawa) charAt() ing Jawa - 1Ayo mbayangno kahanan kang kita kudu extract karakter tartamtu ing sawetara senar. Kepiye carane bisa nindakake iki ing basa Jawa? Contone, kanthi nelpon ing Java String charAt. charAt()Kita bakal ngomong babagan cara ing artikel dina iki.

Sintaksis

char charAt(int index)ngasilake nilai char ing indeks kasebut. Indeks kisaran saka 0 kanggo length()-1. Sing, charnilai pisanan saka urutan ing index 0, sabanjuré ing , index 1etc., minangka kasus karo indeksasi array.

Tuladha

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));
}
Baris pisanan njupuk karakter pisanan, baris kapindho njupuk karakter liyane, lan sateruse. Amarga ora println, nanging digunakake ing kene print, tanpa baris anyar, kita bakal entuk output ing ngisor iki menyang konsol:

Java
Yen charindeks kasebut dituduhake minangka Unicode, asil metode kasebut java charAt()bakal dadi karakter sing makili Unicode iki:
System.out.println("J\u0061vaRush".charAt(1));
Output konsol:

a

Apa sing diarani "ing ngisor tudung"

Kepiye cara kerjane, sampeyan takon? charAt() ing Jawa - 2Kasunyatane yaiku saben obyek Stringngemot array bytekanthi bita saka unsur-unsur string sing diwenehake:
private final byte[] value;
Lan iki cara dhewe chatAt:
public char charAt(int index) {
   if (isLatin1()) {
       return StringLatin1.charAt(value, index);
   } else {
       return StringUTF16.charAt(value, index);
   }
}
isLatin1- gendera sing nuduhake yen string kita mung ngemot karakter Latin utawa ora. Iki nemtokake cara sing bakal diarani sabanjure.

isLatin1 = bener

Yen string mung ngemot karakter Latin, metode charAtkelas statis diarani StringLatin1:
public static char charAt(byte[] value, int index) {
   if (index < 0 || index >= value.length) {
       throw new StringIndexOutOfBoundsException(index);
   }
   return (char)(value[index] & 0xff);
}
Langkah kapisan kanggo mriksa sing indeks mlebu luwih saka utawa padha karo 0, lan iku ora ngluwihi array byte internal, lan yen iki ora cilik, pangecualian di buwang new StringIndexOutOfBoundsException(index). Yen mriksa wis liwati, banjur unsur kita kudu dijupuk. Ing pungkasan kita ndeleng:
  • &ngluwihi kanggo operasi binar kanggo bytebitwise
  • 0xffora nindakake apa-apa nanging &mbutuhake argumentasi
  • (char)Ngonversi data saka tabel ASCII kanggochar

isLatin1 = palsu

Yen kita duwe luwih saka mung karakter Latin, kelas kasebut bakal digunakake StringUTF16lan metode statis kasebut bakal diarani:
public static char charAt(byte[] value, int index) {
   checkIndex(index, value);
   return getChar(value, index);
}
Kang banjur nelpon:
public static void checkIndex(int off, byte[] val) {
   String.checkIndex(off, length(val));
}
Lan dheweke utusan menyang metode statis String:
static void checkIndex(int index, int length) {
   if (index < 0 || index >= length) {
       throw new StringIndexOutOfBoundsException("index " + index +
                                                 ", length " + length);
   }
}
Kene, ing kasunyatan, mriksa digawe kanggo ndeleng yen indeks bener: maneh, apa iku positif utawa nul, lan apa ora ngluwihi watesan saka Uploaded. Nanging ing kelas StringUTF16kanthi metode, charAtnelpon cara liya bakal luwih menarik:
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));
}
Ayo miwiti nganalisa apa sing kedadeyan ing kene. Langkah pisanan ing wiwitan metode yaiku mriksa liyane kanggo validitas indeks. Kanggo mangerteni apa sing kedadeyan sabanjure, sampeyan kudu ngerti: nalika karakter non-Latin mlebu ing array value, diwakili dening rong bita (loro sel array). Yen kita duwe senar saka rong karakter Cyrillic - "av", banjur:
  • kanggo 'a' iki pasangan bita - 48 lan 4;
  • kanggo 'ing' - 50 lan 4.
Yaiku, yen kita nggawe string "av", bakal duwe array value- {48, 4, 50, 4} Bener, cara iki bisa digunakake karo rong sel array value. Mulane, langkah sabanjure yaiku shift index <<= 1;kanggo langsung menyang indeks byte pisanan karakter sing dikarepake ing array value. Saiki ayo ngomong yen kita duwe senar "абвг". Banjur array nilai bakal katon kaya iki: {48, 4, 49, 4, 50, 4, 51, 4}. Kita njaluk unsur katelu saka senar, banjur perwakilan binar 00000000 00000011. Nalika dipindhah dening 1, kita entuk 00000000 00000110, yaiku index = 6. Kanggo refresh kawruh babagan operasi bitwise, sampeyan bisa maca artikel iki . charAt() ing Jawa - 4Kita uga ndeleng sawetara variabel: HI_BYTE_SHIFT ing kasus iki 0. LO_BYTE_SHIFTing kasus iki 8. Ing baris pungkasan metode iki:
  1. Unsur dijupuk saka array nilai lan bitwise dipindhah dening HI_BYTE_SHIFT, yaiku, 0, nalika nambah index +1.

    Ing conto karo senar "абвг", byte enem - 51 - bakal tetep, nanging ing wektu sing padha indeks mundhak kanggo 7.

  2. Sawisé iku, unsur sabanjuré saka Uploaded dijupuk lan mindhah bitwise ing cara sing padha, nanging dening LO_BYTE_SHIFT, sing, dening 8 bit.

    Lan yen kita duwe byte 4, sing nduweni perwakilan binar - 00000000 00000100, banjur sawise nggeser 8 bit kita bakal duwe 00000100 00000000. Yen integer - 1024.

  3. Sabanjure, kanggo rong nilai kasebut, tindakake operasi kasebut | (OR).

    Lan yen kita duwe bait 51 lan 1024, sing ing perwakilan binar katon kaya 00000000 00110011 lan 00000100 00000000, banjur sawise operasi ORkita bakal entuk 00000100 00110011, sing tegese nomer 1075 ing sistem desimal.

    Inggih, ing pungkasan, angka 1075 diowahi dadi jinis char, lan nalika ngowahi int -> char, tabel ASCII digunakake, lan ing kono, ing nomer 1075, ana karakter 'r'.

Sejatine, iki carane entuk 'g' minangka asil saka metode charAt()ing pemrograman Java.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION