JavaRush /Java Blog /Random-ID /charAt() metode di Java

charAt() metode di Java

Dipublikasikan di grup Random-ID
Ada banyak teknik dasar yang biasa kita gunakan tanpa memikirkannya. Nah, bagaimana jika Anda memikirkannya dan melihat bagaimana beberapa metode yang tampaknya sederhana diterapkan? Saya rasa ini akan membantu kita selangkah lebih dekat ke Java) charAt() di Jawa - 1Mari kita bayangkan sebuah situasi di mana kita perlu mengekstrak karakter tertentu dalam beberapa string. Bagaimana kita bisa melakukan ini di Jawa? Misalnya dengan menelepon Java String charAt. charAt()Kami akan membicarakan metode ini di artikel hari ini.

Sintaksis

char charAt(int index)mengembalikan nilai char pada indeks yang ditentukan. Indeks berkisar dari 0 hingga length()-1. Artinya, charnilai pertama dari urutan tersebut adalah in index 0, berikutnya adalah in , index 1dan seterusnya, seperti halnya dengan pengindeksan array.

Contoh

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 pertama mengambil karakter pertama, baris kedua mengambil karakter kedua, dan seterusnya. Karena not println, but digunakan di sini print, tanpa baris baru, kita akan mendapatkan output berikut ke konsol:

Java
Jika charindeks yang diberikan direpresentasikan sebagai Unicode, hasil dari metode ini java charAt()akan menjadi karakter yang mewakili Unicode ini:
System.out.println("J\u0061vaRush".charAt(1));
Keluaran konsol:

a

Apa yang "di bawah tenda"

Bagaimana cara kerjanya, Anda bertanya? charAt() di Jawa - 2Faktanya adalah bahwa setiap objek Stringberisi array bytedengan byte elemen string tertentu:
private final byte[] value;
Dan inilah caranya sendiri chatAt:
public char charAt(int index) {
   if (isLatin1()) {
       return StringLatin1.charAt(value, index);
   } else {
       return StringUTF16.charAt(value, index);
   }
}
isLatin1- sebuah bendera yang menunjukkan apakah string kita hanya berisi karakter Latin atau tidak. Ini menentukan metode mana yang akan dipanggil selanjutnya.

isLatin1 = benar

Jika string hanya berisi karakter Latin, metode charAtkelas statis disebut 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 pertama adalah memeriksa apakah indeks yang masuk lebih besar dari atau sama dengan 0, dan tidak melampaui array byte internal, dan jika tidak demikian, maka pengecualian akan diberikan new StringIndexOutOfBoundsException(index). Jika pemeriksaan lolos, maka elemen yang kita butuhkan sudah diambil. Pada akhirnya kita melihat:
  • &meluas untuk operasi biner hingga bytebitwise
  • 0xfftidak melakukan apa pun kecuali &membutuhkan argumen
  • (char)mengonversi data dari tabel ASCII menjadichar

isLatin1 = salah

Jika kita memiliki lebih dari sekedar karakter Latin, kelas tersebut akan digunakan StringUTF16dan metode statisnya akan dipanggil:
public static char charAt(byte[] value, int index) {
   checkIndex(index, value);
   return getChar(value, index);
}
Yang pada gilirannya memanggil:
public static void checkIndex(int off, byte[] val) {
   String.checkIndex(off, length(val));
}
Dan dia mendelegasikan ke metode statis String:
static void checkIndex(int index, int length) {
   if (index < 0 || index >= length) {
       throw new StringIndexOutOfBoundsException("index " + index +
                                                 ", length " + length);
   }
}
Di sini, sebenarnya, pemeriksaan dilakukan untuk melihat apakah indeks tersebut valid: sekali lagi, apakah positif atau nol, dan apakah indeks tersebut tidak melampaui batas array. Namun di kelas StringUTF16dalam suatu metode, charAtmemanggil metode kedua akan lebih 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));
}
Mari kita mulai menganalisis apa yang sebenarnya terjadi di sini. Langkah pertama di awal metode ini adalah pemeriksaan lagi validitas indeks. Untuk memahami apa yang terjadi selanjutnya, Anda perlu memahami: ketika karakter non-Latin memasuki array value, karakter tersebut diwakili oleh dua byte (dua sel array). Jika kita memiliki rangkaian dua karakter Sirilik - "av", maka:
  • untuk 'a' ini adalah sepasang byte - 48 dan 4;
  • untuk 'dalam' - 50 dan 4.
Artinya, jika kita membuat string “av”, ia akan memiliki array value- {48, 4, 50, 4} Sebenarnya, metode ini bekerja dengan dua sel array value. Oleh karena itu, langkah selanjutnya adalah pergeseran index <<= 1;untuk langsung menuju ke indeks byte pertama dari karakter yang diinginkan dalam array value. Sekarang katakanlah kita memiliki sebuah string "абвг". Maka array nilai akan terlihat seperti ini: {48, 4, 49, 4, 50, 4, 51, 4}. Kami meminta elemen ketiga dari string, dan kemudian representasi binernya adalah 00000000 00000011. Ketika digeser 1, kami mendapatkan 00000000 00000110, yaitu index = 6. Untuk menyegarkan kembali pengetahuan Anda tentang operasi bitwise, Anda dapat membaca artikel ini . charAt() di Jawa - 4Kita juga melihat beberapa variabel: HI_BYTE_SHIFT dalam hal ini adalah 0. LO_BYTE_SHIFTdalam hal ini adalah 8. Pada baris terakhir dari metode ini:
  1. Sebuah elemen diambil dari array nilai dan digeser secara bitwise sebesar HI_BYTE_SHIFT, yaitu 0, sambil meningkat index +1.

    Dalam contoh dengan string "абвг", byte keenam - 51 - akan tetap demikian, tetapi pada saat yang sama indeksnya meningkat menjadi 7.

  2. Setelah ini, elemen array berikutnya diambil dan digeser bitwise dengan cara yang sama, tetapi sebesar LO_BYTE_SHIFT, yaitu sebesar 8 bit.

    Dan jika kita memiliki byte 4, yang memiliki representasi biner - 00000000 00000100, maka setelah menggeser sebanyak 8 bit kita akan memiliki 00000100 00000000. Jika bilangan bulat - 1024.

  3. Selanjutnya, untuk kedua nilai ini, ikuti operasinya | (OR).

    Dan jika kita memiliki byte 51 dan 1024, yang dalam representasi biner terlihat seperti 00000000 00110011 dan 00000100 00000000, maka setelah operasi ORkita akan mendapatkan 00000100 00110011, yang berarti angka 1075 dalam sistem desimal.

    Nah, pada akhirnya angka 1075 diubah menjadi tipe char, dan ketika mengkonversi int -> char digunakan tabel ASCII, dan di dalamnya, di bawah angka 1075, terdapat karakter 'r'.

Sebenarnya dengan cara inilah kita mendapatkan 'g' sebagai hasil dari metode charAt()dalam pemrograman Java.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION