JavaRush /Java Blog /Random-TK /Java-da setirler (java.lang.String)
Viacheslav
Dereje

Java-da setirler (java.lang.String)

Toparda çap edildi

Giriş

Programmistiň ýoly çylşyrymly we uzyn prosesdir. Köplenç ýagdaýda “Salam World” -y ekranda görkezýän programma bilen başlaýar. Java hem muňa degişli däldir (Sapak: "Salam Dünýä!" Programmasyna serediň ). Görşümiz ýaly, habar ulanylýar System.out.println("Hello World!"); Java Java-a seretseňiz, System.out.println usuly String-i giriş parametri hökmünde alýar . Maglumatlaryň bu görnüşi ara alnyp maslahatlaşylar.

Nyşanlaryň yzygiderliligi hökmünde setir

Aslynda iňlis dilinden terjime edilen setir setirdir. Dogry, Setir görnüşi tekst setirini aňladýar. Tekst setiri näme? Tekst setiri, biri-birini yzarlaýan nyşanlaryň yzygiderliligi. Nyşan nyşan Yzygiderlilik - yzygiderlilik. Hawa, düýbünden dogry, String durmuşa geçirmekdir java.lang.CharSequence. Eger-de String synpynyň içine seretseň, onuň içinde bir topar harpdan başga zat ýok: private final char value[]; Bu java.lang.CharSequencegaty ýönekeý şertnama:
Java-da setirler (java.lang.String synpy) - 1
Elementleriň sanyny almak, belli bir element almak we elementler toplumyny + toString usulyny almak üçin bir usulymyz bar, bu bolsa ony yzyna gaýtaryp berer) Java 8-de bize gelen usullara düşünmek has gyzykly we şu . chars()_ codePoints() _ _ _ single 16-bit Unicode character_ ASCII tablisasynda ) . .Agny, islesek, char-ni int görnüşinde görkezip bileris. Java 8-den peýdalandy. Java-yň 8-nji wersiýasyndan başlap, bizde IntStream - başlangyç ints bilen işlemek üçin akym bar. Şonuň üçin charSequence-de harplary ýa-da kod kodlaryny görkezýän IntStream-i almak bolýar. Olara geçmezden ozal, bu çemeleşmäniň amatlylygyny görkezmek üçin bir mysal göreris. Geliň, Tutorialspoint onlaýn java düzüjisini ulanalyň we kody ýerine ýetireliň:
public static void main(String []args){
        String line = "aaabccdddc";
        System.out.println( line.chars().distinct().count() );
}
Indi bu ýönekeý usul bilen birnäçe täsin nyşanlary alyp bilersiňiz.

CodePoints

Şeýlelik bilen, harplar hakda gördük. Indi bularyň haýsy kod nokatlarydygy entek belli däl. CodePoint düşünjesi peýda boldy, sebäbi Java peýda bolanda, bir nyşan kodlamak üçin 16 bit (ýarym int) ýeterlikdi. Şonuň üçin java-daky char UTF-16 formatda görkezilýär ("icunikod 88" spesifikasiýasy). Soň bolsa, “Unicode 2.0” peýda boldy, düşünjesi birmeňzeş jübüt hökmünde bir gahrymany görkezmekdi (2 simwol). Bu, mümkin bolan bahalaryň diapazonyny int bahasyna çenli giňeltmäge mümkinçilik berdi. Has giňişleýin maglumat üçin stackoverflow-a serediň: " Çarçuwany kod nokady bilen deňeşdirmek? " UTF-16, JavaDoc-da häsiýet üçin hem agzalýar . Şol ýerde, JavaDoc-da şeýle diýilýär: 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). Muny adaty elipbiýde köpeltmek gaty kyn (we hatda mümkin däl). Emma nyşanlar harplar we sanlar bilen gutarmaýar. Japanaponiýada emoji ýaly kodlamak gaty kyn bir zat - ideogrammalaryň we emotikleriň dili boldy. Wikipediýada bu barada gyzykly makala bar: “ Emoji ”. Emojiniň mysalyny tapalyň, mysal üçin: “ Emoji arwah ”. Görşümiz ýaly, şol bir kodPoint hatda görkezilýär (baha = U + 1F47B). Alty ölçegli görnüşde görkezilýär. Onluk sana öwürsek, 128123 alarys. Bu 16 bitden köp rugsat berýär (ýagny 65535-den gowrak). Göçüreliň:
Java-da setirler (java.lang.String synpy) - 2
Gynansagam, JavaRush platformasy tekstdäki beýle nyşanlary goldamaýar. Şonuň üçin aşakdaky mysalda String-a baha girizmeli bolarsyňyz. Şonuň üçin indi ýönekeý synaga düşüneris:
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
}
Görşüňiz ýaly, bu ýagdaýda 1 kodPoint 2 harp üçin gidýär. Bu jady.

Nyşan

Aboveokarda görşümiz ýaly, Java-daky setirler chardan durýar. Ilkinji görnüş bir bahany saklamaga mümkinçilik berýär, ýöne java.lang.Characterýönekeý görnüşdäki örtük bu nyşan bilen köp peýdaly işleri etmäge mümkinçilik berýär. Mysal üçin, bir setiri baş harplara öwrüp bileris:
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));
}
Garaz, dürli gyzykly zatlar: isAlphabetic(),,,,, isLetter()( mysal üçin, ýaýlar. '(' Aýna şekili bar ') isSpaceChar()' ) isDigit().isUpperCase()isMirrored()

Setir howzy

Java-daky setirler üýtgewsiz, ýagny hemişelik. Bu, java.lang.String synpynyň JavaDoc-da görkezilýär . Ikinjiden, şeýle hem örän möhüm setirleri sözme-söz hökmünde kesgitläp bolar:
String literalString = "Hello, World!";
String literalString = "Hello, World!";
.Agny, ýokarda aýdylyşy ýaly getirilen islendik setir aslynda obýektdir. Bu bir soragy döredýär - eger setirleri ýygy-ýygydan ulansak we olar köplenç birmeňzeş bolup bilsek (mysal üçin, "roralňyşlyk" ýa-da "Üstünlikli" teksti), setirleriň her gezek döredilmeýändigine göz ýetirmek üçin bir usul barmy? .Eri gelende aýtsak, henizem açar setir bolup bilýän Kartalar bar. Onda hökman birmeňzeş setirleriň dürli obýekt bolup bilmezligi mümkin, ýogsam obýekti Kartadan alyp bilmeris. Java döredijileri pikirlenip, pikirlenip, “String Pool” -y oýlap tapdylar. Bu setirleriň saklanýan ýeri, oňa sim keşi diýip bilersiňiz. Setirleriň hemmesi ol ýerde gutarmaýar, diňe kodda görkezilen setirler. Howuza özüňiz bir setir goşup bilersiňiz, ýöne soňundan has köp. Şeýlelik bilen, ýadymyzda bu keş bar. Adalatly sorag: bu howuz nirede? Munuň jogabyny yzygiderli akymdan tapyp bilersiňiz: “ Java-yň String hemişelik howuzy, üýşmek ýa-da taýak nirede ýaşaýar? " Heap ýadynda, ýörite iş wagty hemişelik howuz meýdançasynda ýerleşýär. Iş wagtynyň hemişelik howzy , usul meýdanyndan wirtual maşyn tarapyndan synp ýa-da interfeýs döredilende bölünýär - Java wirtual maşynyň içindäki ähli sapaklara girip boljak Heap-da ýörite meýdan. Setir howzy bize näme berýär? Munuň birnäçe artykmaçlygy bar:
  • Şol bir görnüşdäki obýektler döredilmez
  • Salgy boýunça deňeşdirme, deňhukuklar arkaly häsiýet-häsiýet deňeşdirmesinden has çalt
Emma döredilen obýekti bu keş görnüşine salmak islesek näme etmeli? Soň bolsa, ýörite usulymyz bar: String.intern Bu usul setir howzuna setir goşýar. Munuň diňe bir massiw görnüşindäki keş görnüşi däldigini bellemelidiris (Integers ýaly). Tejribe usuly "ýerli" hökmünde görkezilýär. Bu usulyň başga dilde (esasanam C ++) durmuşa geçirilýändigini aňladýar. Esasy Java usullary bolan ýagdaýynda, JVM derejesinde olara başga dürli optimizasiýalar ulanylyp bilner. Umuman, bu ýerde jady bolar. Intern hakda aşakdaky ýazgyny okamak gyzykly: https://habr.com/post/79913/#comment_2345814 We gowy pikir ýaly. Emma bu bize nähili täsir eder? Emma hakykatdanam täsir eder)
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal");
    System.out.println(test == test2);
}
Görşüňiz ýaly setirler birmeňzeş, ýöne netije ýalňyş bolar. Hemmesi sebäbi == baha bilen däl-de, salgylanma bilen deňeşdirilýär. Bu nähili işleýär:
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test == test2);
}
Diňe täze setir ýasaýarys. Internagny, intern bize keşden bir setir gaýtaryp berer, ýöne keşde gözlän asyl setirimiz arassalamak üçin zyňylar, sebäbi ol hakda başga hiç kim bilenok. Elbetde, çeşmeleriň gereksiz sarp edilmegi = (Şonuň üçin, duýdansyz we mümkin boldugyça ýalňyşlary ýüze çykarmak kyn bolmagy üçin elmydama deň setirleri deňeşdirmeli.
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test.equals(test2));
}
Deňdirler, nyşanlara görä simwol deňeşdirmesini ýerine ýetirýärler.

Bileleşik

.Adymyzda bolsa, setirler goşup bolýar. We ýadymyzda bolsa, setirlerimiz üýtgewsizdir. Onda nähili işleýär? Dogry, goşulýan obýektleriň nyşanlaryndan ybarat täze setir döredilýär. Goşmaça birleşmäniň işleýşiniň million görnüşi bar. Käbir adamlar her gezek täze bir zat bolar öýdýärler, käbirleri başga bir zat bolar öýdýärler. Onlyöne diňe bir adam dogry aýdyp biler. Kimdir biri javac düzüjisi. Onlaýn kompýuter hyzmatyny ulanalyň we işledeliň:
public class HelloWorld {

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

}
Indi muny zip arhiwi hökmünde saklalyň, bir kataloga çykaryň we ýerine ýetireliň: javap –c HelloWorld Ine, şu ýerde hemme zady bilýäris:
Java-da setirler (java.lang.String) - 3
Elbetde, aýlawda “StringBuilder” -iň üsti bilen birleşmegi ýerine ýetirmek has gowudyr. Haýsydyr bir jady sebäpli däl-de, “StringBuilder” aýlawdan öň döredilip, aýlawda diňe goşundy bolýar. .Eri gelende aýtsak, bu ýerde başga bir gyzykly zat bar. Ajaýyp bir makala bar: “ Java-da setirleri gaýtadan işlemek. I bölüm: Setir, StringBuffer, StringBuilder . " Teswirlerde köp peýdaly maglumatlar. Mysal üçin, görnüşi birleşdirende, new StringBuilder().append()...toString()içerki optimizasiýanyň güýje girýändigi, -XX: + OptimizeStringConcat opsiýasy bilen kadalaşdyrylýar, deslapky görnüşde işledilýär. içerki - “içerki” hökmünde terjime edilýär. JVM şular ýaly zatlary aýratyn usul bilen işleýär, olary ýerli görnüşde gaýtadan işleýär, diňe JNI goşmaça çykdajylary bolmazdan. Dowamyny oka: " HotSpot VM-de içerki usullar ".

StringBuilder we StringBuffer

Aboveokarda görşümiz ýaly, StringBuilder gaty peýdaly gural. Setirler üýtgewsiz, ýagny üýtgewsiz. Men ony bukasym gelýär. Şonuň üçin bize kömek etmek üçin bize 2 synp berilýär: StringBuilder we StringBuffer. Ikisiniň arasyndaky esasy tapawut, StringBuffer JDK1.0-de girizildi, StringBuilder bolsa gereksiz usul sinhronizasiýasynyň artýan üstüni ýok etmek üçin StringBuffer-iň sinhron däl görnüşi hökmünde java 1.5-de geldi. Bu synplaryň ikisi hem abstrakt synpyň abstraktStringBuilder - nyşanlaryň üýtgäp bilýän yzygiderliligi. Içinde jadylar toplumy saklanýar, düzgüne görä giňeldilýär: value.length * 2 + 2. Düzgüne görä, StringBuilder-iň ululygy (kuwwaty) 16.

Deňeşdirip bolar

Setirler deňeşdirilýär, ýagny deňeşdirmek usulyny durmuşa geçiriň. Bu, nyşanlary deňeşdirmek arkaly amala aşyrylýar. Gyzykly tarapy, iň az uzynlyk iki setirden saýlanýar we üstünde bir aýlaw ýerine ýetirilýär. Şonuň üçin deňeşdirmek, ýa-da ilkinji deňi-taýy bolmadyk nyşanlaryň int bahalarynyň arasyndaky tapawudy iň kiçi setir uzynlygyna gaýtaryp berer ýa-da ähli simwollar iň az setir uzynlygynda gabat gelse, setir uzynlygynyň arasyndaky tapawudy yzyna gaýtaryp berer. Bu deňeşdirme “leksikografik” diýilýär.

Java setirleri bilen işlemek

Setiriň köp peýdaly usullary bar:
Java-da setirler (java.lang.String synpy) - 4
Setirler bilen işlemek üçin köp meseleler bar. Mysal üçin, Kod kodunda . Şeýle hem kursda: " Setirlerdäki algoritmler " bar.

Netije

Bu synp hakda gysgaça syn hem täsirli ýer tutýar. Bularyň hemmesi däl. JPoint 2015-den hasabaty görmegi maslahat berýärin: Alekseý Şipilew - Katekizm java.lang.String
# Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION