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) Geliň, 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, char
yzygiderliligiň birinji bahasy , indeks indeksinde bolşy ýaly, index 0
indiki 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? Hakykat, her bir obýektde berlen setir elementleriniň baýtlary bolanString
bir 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, statikicharAt
synp 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 üçinbyte
birneme uzalýar0xff
&
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 ulanylarStringUTF16
we 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. StringUTF16
Emma usulda bir synpda charAt
ikinji 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.
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 . Käbir üýtgeýjileri hem görýäris: HI_BYTE_SHIFT
bu ýagdaýda 0 bolýar, LO_BYTE_SHIFT
bu ýagdaýda 8 bolýar. Bu usulyň soňky setirinde:
- Bir element baha massiwinden alynýar we
HI_BYTE_SHIFT
ulalýarka 0 bilen üýtgedilýärindex +1
.Setir bilen mysalda
"абвг"
, altynjy baýt - 51 - şeýle galar, ýöne şol bir wagtyň özünde indeks 7-e çenli ýokarlanýar. - 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.
- 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ň
OR
00000100 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 .
GO TO FULL VERSION