JavaRush /Blog Jawa /Random-JV /Strings in Java (class java.lang.String)
Viacheslav
tingkat

Strings in Java (class java.lang.String)

Diterbitake ing grup

Pambuka

Path saka programmer minangka proses sing rumit lan dawa. Lan ing umume kasus diwiwiti kanthi program sing nampilake Hello World ing layar. Jawa ora kajaba (pirsani Pelajaran: Aplikasi "Hello World!" ). Nalika kita bisa ndeleng, pesen output nggunakake System.out.println("Hello World!"); Yen katon ing API Jawa, System.out.println cara njupuk String minangka parameter input . Jinis data iki bakal dibahas.

String minangka urutan karakter

Bener, String sing diterjemahake saka basa Inggris yaiku string. Sing bener, jinis String nggambarake string teks. Apa string teks? String teks yaiku sawetara urutan karakter sing diurutake. Simbol punika char. Urutan – urutan. Dadi ya, pancen bener, String minangka implementasine saka java.lang.CharSequence. Lan yen sampeyan ndeleng ing kelas String dhewe, ing njero ora ana apa-apa liyane saka macem-macem karakter: private final char value[]; Nduwe java.lang.CharSequencekontrak sing cukup prasaja:
Strings in Java (class java.lang.String) - 1
Kita duwe cara kanggo njupuk jumlah unsur, entuk unsur tartamtu lan entuk set unsur + metode toString dhewe, sing bakal ngasilake iki) Iku luwih menarik kanggo mangerteni metode sing teka ing Jawa 8, lan iki : chars()lan codePoints() Kelingan saka Tutorial saka Oracle " Primitive Data " Types " sing char yaiku single 16-bit Unicode character. Yaiku, char mung minangka jinis setengah ukuran int (32 bit) sing nuduhake angka saka 0 nganti 65535 (ndeleng nilai desimal ing Tabel ASCII ). Sing, yen kita pengin, kita bisa makili char minangka int. Lan Jawa 8 njupuk kauntungan saka iki. Miwiti karo versi Jawa 8, kita duwe IntStream - stream kanggo nggarap int primitif. Mulane, ing charSequence bisa diwenehi IntStream sing makili karakter utawa codePoints. Sadurunge kita pindhah menyang wong-wong mau, kita bakal weruh conto kanggo nuduhake penak saka pendekatan iki. Ayo nggunakake Tutorialspoint kompiler java online lan nglakokake kode:
public static void main(String []args){
        String line = "aaabccdddc";
        System.out.println( line.chars().distinct().count() );
}
Saiki sampeyan bisa entuk sawetara simbol unik kanthi cara sing gampang iki.

CodePoints

Dadi, kita ndeleng babagan karakter. Saiki ora jelas apa jenis kode kasebut. Konsep codePoint muncul amarga nalika Jawa muncul, 16 bit (setengah int) cukup kanggo ngodhe karakter. Mulane, char ing java diwakili ing format UTF-16 (spesifikasi "Unicode 88"). Banjur muncul Unicode 2.0, sing konsep kanggo makili karakter minangka pasangan pengganti (2 karakter). Iki ngidini kita nggedhekake sawetara nilai sing bisa dadi nilai int. Kanggo rincian liyane, deleng stackoverflow: " Mbandingake karakter karo titik kode? " UTF-16 uga kasebut ing JavaDoc kanggo Karakter . Ana, ing JavaDoc, ngandika: Iku In this representation, supplementary characters are represented as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the low-surrogates range (\uDC00-\uDFFF). cukup angel (lan Mungkin malah mokal) kanggo ngasilaken iki ing aksara standar. Nanging simbol ora mungkasi karo huruf lan angka. Ing Jepang padha teka karo soko angel kanggo encode minangka emoji - basa ideograms lan emoticon. Ana artikel menarik babagan iki ing Wikipedia: " Emoji ". Ayo goleki conto emoji, umpamane: " Emoji Ghost ". Kaya sing kita deleng, kodePoint sing padha malah dituduhake ing kana (nilai = U + 1F47B). Iki dituduhake ing format heksadesimal. Yen kita Ngonversi menyang nomer desimal, kita njaluk 128123. Iki luwih saka 16 bit ngidini (i.e. luwih saka 65535). Ayo disalin:
Strings in Java (class java.lang.String) - 2
Sayange, platform JavaRush ora ndhukung karakter kasebut ing teks. Mulane, ing conto ing ngisor iki sampeyan kudu nglebokake nilai menyang String. Mulane, saiki kita bakal ngerti tes prasaja:
public static void main(String []args){
	    String emojiString = "Вставте сюда эмоджи через ctrl+v";
	    //На один emojiString приходится 2 чара (т.к. не влезает в 16 бит)
	    System.out.println(emojiString.codePoints().count()); //1
	    System.out.println(emojiString.chars().count()); //2
}
Nalika sampeyan bisa ndeleng, ing kasus iki 1 codePoint dadi kanggo 2 karakter. Iki sihir.

Watak

Kaya sing wis dingerteni ing ndhuwur, String ing Jawa kalebu char. A jinis primitif ngijini sampeyan kanggo nyimpen Nilai, nanging pambungkus java.lang.Characterliwat jinis primitif ngijini sampeyan kanggo nindakake akèh iku migunani karo simbol iki. Contone, kita bisa ngowahi string dadi huruf gedhe:
public static void main(String[] args) {
    String line = "организация объединённых наций";
    char[] chars = line.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (i == 0 || chars[i - 1] == ' ') {
            chars[i] = Character.toUpperCase(chars[i]);
        }
    }
    System.out.println(new String(chars));
}
Inggih, macem-macem menarik: isAlphabetic(), isLetter(), isSpaceChar(), isDigit(), isUpperCase(), isMirrored()(contone, kurung. '(' duwe gambar pangilon ')').

Kolam String

String ing basa Jawa iku ora owah, yaiku konstan. Iki uga dituduhake ing JavaDoc saka kelas java.lang.String dhewe . Kapindho, lan uga penting banget, senar bisa ditemtokake minangka literal:
String literalString = "Hello, World!";
String literalString = "Hello, World!";
Tegese, senar sing dipetik, kaya sing kasebut ing ndhuwur, sejatine minangka obyek. Lan iki dadi pitakonan - yen kita nggunakake strings supaya kerep lan padha bisa asring padha (contone, teks "Error" utawa "Kasil"), apa ana cara kanggo mesthekake yen strings ora digawe saben wektu? Miturut cara, kita isih duwe Maps, ngendi tombol bisa dadi senar. Banjur kita mesthi ora bisa duwe strings padha obyek beda, digunakake kita ora bakal bisa kanggo njaluk obyek saka Peta. Pangembang Jawa mikir, mikir lan teka karo String Pool. Iki panggonan ngendi strings disimpen, sampeyan bisa nyebataken cache senar. Ora kabeh garis dhewe mungkasi ana, nanging mung baris kasebut ing kode dening literal. Sampeyan bisa nambah baris menyang blumbang dhewe, nanging liyane ing mengko. Dadi, ing memori kita duwe cache iki nang endi wae. Pitakonan sing adil: ing ngendi blumbang iki dumunung? Jawaban kanggo iki bisa ditemokake ing stackoverflow: " Ing ngendi blumbang konstan String Jawa manggon, tumpukan utawa tumpukan? " Dumunung ing memori Heap, ing area blumbang pancet runtime khusus. Runtime blumbang pancet diparengake nalika kelas utawa antarmuka digawe dening mesin virtual saka area cara - wilayah khusus ing Heap sing kabeh Utas nang Java Virtual Machine duwe akses kanggo. Apa String pool menehi kita? Iki duwe sawetara kaluwihan:
  • Obyek saka jinis sing padha ora bakal digawe
  • Perbandhingan kanthi referensi luwih cepet tinimbang mbandhingake karakter kanthi karakter liwat padha
Nanging apa yen kita pengin sijine obyek digawe menyang cache iki? Banjur, kita duwe cara khusus: String.intern Cara iki nambah senar menyang Kolam String. Wigati dicathet menawa iki ora mung sawetara jenis cache ing wangun array (minangka Integers). Cara intern ditemtokake minangka "native". Iki tegese cara kasebut dhewe ditindakake ing basa liya (biasane C++). Ing kasus metode Java dhasar, macem-macem optimasi liyane bisa ditrapake ing tingkat JVM. Umumé, sihir bakal kelakon ing kene. Iku menarik kanggo maca kirim ing ngisor iki babagan interns: https://habr.com/post/79913/#comment_2345814 Lan misale jek kaya apike. Nanging kepiye iki bakal mengaruhi kita? Nanging pancen bakal duwe pengaruh)
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal");
    System.out.println(test == test2);
}
Nalika sampeyan bisa ndeleng, garis padha, nanging asil bakal palsu. Lan kabeh amarga == mbandhingake ora kanthi nilai, nanging kanthi referensi. Lan iki cara kerjane:
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test == test2);
}
Elinga yen kita isih bakal nggawe String anyar. Yaiku, intern bakal ngasilake String saka cache, nanging String asli sing digoleki ing cache bakal dibuwang kanggo ngresiki, amarga ora ana wong liya sing ngerti babagan dheweke. Iki jelas konsumsi sumber daya sing ora perlu = ( Mula, sampeyan kudu mbandhingake senar kanthi nggunakake padha supaya ora bisa dideteksi kanthi cepet lan angel.
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test.equals(test2));
}
Equals nindakake perbandingan string karakter-by-karakter.

Concatenation

Minangka kita elinga, garis bisa ditambahake. Lan nalika kita ngelingi, senar kita ora bisa diganti. Dadi kepiye cara kerjane? Bener, baris anyar digawe, sing kalebu simbol obyek sing ditambahake. Ana yuta versi carane plus concatenation dianggo. Sawetara wong mikir yen bakal ana obyek anyar saben wektu, wong liya mikir yen bakal ana barang liya. Nanging mung siji wong sing bener. Lan wong iku compiler javac. Ayo nggunakake layanan kompiler online lan mbukak:
public class HelloWorld {

    public static void main(String[] args) {
        String helloMessage = "Hello, ";
        String target = "World";
        System.out.println(helloMessage + target);
    }

}
Saiki ayo simpen iki minangka arsip zip, ekstrak menyang direktori lan eksekusi: javap –c HelloWorld Lan ing kene kita nemokake kabeh:
Strings in Java (class java.lang.String) - 3
Ing daur ulang, mesthi, luwih apik kanggo nindakake concatenation liwat StringBuilder dhewe. Lan ora amarga sawetara jinis sihir, nanging supaya StringBuilder digawe sadurunge siklus, lan ing siklus dhewe mung append ana. Miturut cara, ana liyane menarik kene. Ana artikel sing apik banget: " Pengolahan String ing Jawa. Bagian I: String, StringBuffer, StringBuilder ." Kathah informasi migunani ing komentar. Contone, ditetepake yen nalika nggabungake tampilan, new StringBuilder().append()...toString()optimasi intrinsik ditrapake, diatur dening pilihan -XX:+OptimizeStringConcat, sing diaktifake kanthi standar. intrinsik - diterjemahake minangka "internal". JVM nangani barang kasebut kanthi cara khusus, ngolah minangka Native, mung tanpa biaya tambahan JNI. Waca liyane: " Metode Intrinsik ing HotSpot VM ".

StringBuilder lan StringBuffer

Kaya sing wis dingerteni ing ndhuwur, StringBuilder minangka alat sing migunani banget. String ora bisa diganti, yaiku. ora bisa owah. Lan aku pengin melu. Mulane, kita diwenehi 2 kelas kanggo mbantu kita: StringBuilder lan StringBuffer. Bentenipun utama antarane loro iku StringBuffer iki ngenalaken ing JDK1.0, nalika StringBuilder teka ing java 1.5 minangka versi non-nyelarasake StringBuffer kanggo ngilangke nduwur sirah tambah saka sinkronisasi cara rasah. Loro-lorone kelas kasebut minangka implementasi saka kelas abstrak AbstractStringBuilder - Urutan karakter sing bisa diganti. Ana macem-macem jimat disimpen ing njero, sing ditambahi miturut aturan: value.length * 2 + 2. Kanthi gawan, ukuran (kapasitas) StringBuilder yaiku 16.

Dibandhingake

Senar kasebut bisa dibandhingake, yaiku. ngleksanakake metode compareTo. Iki ditindakake kanthi nggunakake perbandingan karakter kanthi karakter. Apike, dawa minimal dipilih saka rong senar lan daur ulang dieksekusi. Mulane, compareTo bakal ngasilake prabédan antarane nilai int saka karakter pisanan sing ora cocog nganti dawa senar sing paling cilik, utawa ngasilake beda antarane dawa senar yen kabeh karakter cocog ing dawa senar minimal. Perbandingan iki diarani "lexicographical".

Nggarap Java Strings

String nduweni akeh cara sing migunani:
Strings in Java (class java.lang.String) - 4
Ana akeh tugas kanggo nggarap senar. Contone, ing Coding Bat . Ana uga kursus ing coursera: " Algoritma ing Strings ".

Kesimpulan

Malah ringkesan singkat saka kelas iki njupuk munggah jumlah nyengsemaken saka papan. Lan ora mung kuwi. Aku banget nyaranake nonton laporan saka JPoint 2015: Alexey Shipilev - Catechism java.lang.String
#Viacheslav
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION