JavaRush /Блоги Java /Random-TG /Сатрҳо дар Java (синфи java.lang.String)
Viacheslav
Сатҳи

Сатрҳо дар Java (синфи java.lang.String)

Дар гурӯҳ нашр шудааст

Муқаддима

Роҳи барномасоз як раванди мураккаб ва тӯлонӣ аст. Ва дар аксари мавридҳо он бо барномае оғоз мешавад, ки дар экран Hello World нишон медиҳад. Java истисно нест (ниг. Дарс: Замимаи "Салом Ҷаҳон!" ). Тавре ки мо мебинем, паём бо истифода System.out.println("Hello World!"); аз Java API бароварда мешавад, усули System.out.println String ҳамчун параметри вурудро мегирад . Ин намуди маълумот муҳокима карда мешавад.

Сатр ҳамчун пайдарпаии аломатҳо

Дар асл, String аз забони англисӣ тарҷумашуда сатр аст. Дуруст аст, навъи String сатри матнро ифода мекунад. Сатри матн чист? Сатри матн як навъ пайдарпайии тартибёфтаи аломатҳоест, ки якдигарро пайравӣ мекунанд. Рамз char аст. пайдарпай – пайдарпай. Пас, ҳа, комилан дуруст, String татбиқи java.lang.CharSequence. Ва агар шумо ба дохor худи синфи String назар андозед, пас дар дохor он ғайр аз массиви аломатҳо чизе бештар нест: private final char value[]; Он дорои java.lang.CharSequenceшартномаи хеле содда аст:
Сатрҳо дар Java (синфи java.lang.String) - 1
Мо як усули ба даст овардани шумораи элементҳо, гирифтани як унсури мушаххас ва гирифтани маҷмӯи элементҳо + худи усули toString дорем, ки онро бармегардонад) Фаҳмидани усулҳое, ки дар Java 8 ба мо омадаанд, ҷолибтар аст ва ин аст : chars()ва codePoints() Ёдоварӣ аз дастури Oracle " Маълумоти ибтидоӣ" Намудҳои "чар" single 16-bit Unicode character, яъне аслан char як навъи нисфи андозаи int (32 бит) аст, ки рақамҳоро аз 0 то 65535 ифода мекунад (ниг. қимматҳои даҳӣ дар ҷадвали ASCII ). Яъне, агар бихоҳем, мо метавонем char-ро ҳамчун int муаррифӣ кунем. Ва Java 8 аз ин истифода бурд. Аз versionи 8-и Java сар карда, мо IntStream дорем - ҷараён барои кор бо интҳои ибтидоӣ. Аз ин рӯ, дар charSequence метавон IntStream-ро, ки аломатҳо ё codePoints-ро ифода мекунад, ба даст овард. Пеш аз он ки мо ба онҳо гузарем, мо барои нишон додани роҳати ин равиш як мисол хоҳем дид. Биёед компилятори онлайни Java Tutorialspoint-ро истифода барем ва codeро иҷро кунем:
public static void main(String []args){
        String line = "aaabccdddc";
        System.out.println( line.chars().distinct().count() );
}
Акнун шумо метавонед як қатор рамзҳои беназирро бо ин роҳи оддӣ ба даст оред.

CodePoints

Ҳамин тавр, мо дар бораи аломатҳо дидем. Ҳоло маълум нест, ки ин чӣ гуна нуқтаҳои рамзӣ мебошанд. Консепсияи codePoint аз он сабаб пайдо шуд, ки вақте Java пайдо шуд, барои рамзгузории аломат 16 бит (ним int) кифоя буд. Аз ин рӯ, char дар java дар формати UTF-16 муаррифӣ мешавад (мутахассиси "Юниcode 88"). Баъдтар, Юниcode 2.0 пайдо шуд, ки консепсияи он ҳамчун як ҷуфти суррогат (2 аломат) ифода кардани аломат буд. Ин ба мо имкон дод, ки доираи арзишҳои имконпазирро то арзиши int васеъ кунем. Барои тафсилоти бештар, нигаред ба stackoverflow: " Муқоиса кардани аломат бо нуқтаи code? " UTF-16 инчунин дар JavaDoc for Character зикр шудааст . Дар он ҷо, дар JavaDoc гуфта мешавад, ки: 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). Таҷдиди ин дар алифбои стандартӣ хеле душвор аст (ва шояд ҳатто ғайриимкон). Аммо рамзҳо бо ҳарфҳо ва рақамҳо хотима намеёбанд. Дар Ҷопон онҳо як чизи хеле душворро ҳамчун эмодзи рамзгузорӣ кардан - забони идеограммаҳо ва эмотиконҳо пайдо карданд. Дар ин бора дар Википедиа як мақолаи ҷолиб мавҷуд аст: “ Emoji ”. Биёед мисоли эмодзиро пайдо кунем, масалан, ин: “ Emoji Ghost ”. Тавре ки мо мебинем, ҳамон codePoint ҳатто дар он ҷо нишон дода шудааст (арзиш = U+1F47B). Он дар формати шонздаҳӣ нишон дода шудааст. Агар мо ба адади даҳӣ табдил ёбем, мо 128123 мегирем. Ин зиёда аз 16 бит иҷозат медиҳад (яъне зиёда аз 65535). Биёед онро нусхабардорӣ кунем:
Сатрҳо дар Java (синфи java.lang.String) - 2
Мутаассифона, платформаи JavaRush чунин аломатҳоро дар матн дастгирӣ намекунад. Аз ин рӯ, дар мисоли дар поён овардашуда ба шумо лозим меояд, ки арзишро ба String ворид кунед. Аз ин рӯ, ҳоло мо як санҷиши оддиро мефаҳмем:
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
}
Тавре ки шумо мебинед, дар ин ҳолат 1 codePoint барои 2 аломат меравад. Ин ҷоду аст.

Характер

Тавре ки мо дар боло дидем, сатрҳо дар Java аз char иборатанд. Навъи ибтидоӣ ба шумо имкон медиҳад, ки арзишро нигоҳ доред, аммо парпеч java.lang.Characterдар болои навъи ибтидоӣ ба шумо имкон медиҳад, ки бо ин рамз бисёр корҳои муфидро анҷом диҳед. Масалан, мо метавонем сатрро ба ҳарфи калон табдил диҳем:
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));
}
Хуб, чизҳои ҷолиби гуногун: isAlphabetic(), isLetter(), isSpaceChar(), isDigit(), isUpperCase(), isMirrored()(масалан, қавс. '(' тасвири оина дорад ')').

Ҳавзи сатр

Сатрҳо дар Java тағирнопазиранд, яъне доимӣ. Ин инчунин дар JavaDoc-и худи синфи java.lang.String нишон дода шудааст . Дуюм ва инчунин хеле муҳим, сатрҳоро метавон ҳамчун литерал муайян кард:
String literalString = "Hello, World!";
String literalString = "Hello, World!";
Яъне, ҳама гуна сатри иқтибосшуда, тавре ки дар боло гуфта шуд, воқеан an object аст. Ва ин савол ба миён меояд - агар мо сатрҳоро зуд-зуд истифода кунем ва онҳо аксар вақт якхела бошанд (масалан, матни "Хато" ё "Бомуваффақият"), оё ягон роҳи боварӣ ҳосил кардан вуҷуд дорад, ки сатрҳо ҳар дафъа сохта намешаванд? Дар омади гап, мо то ҳол Харитаҳо дорем, ки дар он калид метавонад сатр бошад. Он гоҳ мо бешубҳа наметавонем як сатрро an objectҳои гуногун дошта бошем, вагарна мо an objectро аз Харита гирифта наметавонем. Таҳиягарони Java фикр карданд, фикр карданд ва бо String Pool пайдо шуданд. Ин ҷоест, ки сатрҳо нигоҳ дошта мешаванд, шумо метавонед онро кэши сатр номид. На ҳама сатрҳо дар он ҷо ба охир мерасанд, балки танҳо сатрҳое, ки дар code бо ҳарфи литералӣ нишон дода шудаанд. Шумо метавонед як хатро ба ҳавз худатон илова кунед, аммо дар ин бора баъдтар. Ҳамин тавр, дар хотира мо ин кэш дар ҷое дорем. Саволи одилона: ин ҳавз дар куҷо ҷойгир аст? Ҷавобро ба ин дар stackoverflow пайдо кардан мумкин аст: “ Ҳавзи доимии Java String дар куҷо зиндагӣ мекунад, теппа ё стек? " Он дар хотираи Heap, дар минтақаи ҳавзи доимии вақти корӣ ҷойгир аст. Ҳавзи доимии Runtime вақте ҷудо карда мешавад, ки синф ё интерфейс аз ҷониби мошини маҷозӣ аз минтақаи метод - як минтақаи махсус дар Heap сохта мешавад, ки ҳамаи риштаҳои дохor мошини виртуалии Java дастрасӣ доранд. String pool ба мо чӣ медиҳад? Ин як қатор афзалиятҳо дорад:
  • Объектҳои як навъ эҷод карда намешаванд
  • Муқоиса аз рӯи истинод нисбат ба муқоисаи аломат ба аломат тавассути баробар зудтар аст
Аммо агар мо хоҳем, ки an objectи сохташударо ба ин кэш гузорем? Пас, мо як усули махсус дорем: String.intern Ин усул сатрро ба ҳавзи сатр илова мекунад. Бояд қайд кард, ки ин танҳо як намуди кэш дар шакли массив нест (ба монанди барои бутунӣ). Усули интерн ҳамчун "модарӣ" муайян карда шудааст. Ин маънои онро дорад, ки худи усул ба забони дигар амалӣ карда мешавад (асосан C++). Дар мавриди усулҳои асосии Java, ба онҳо дар сатҳи JVM оптимизатсияҳои гуногуни дигар татбиқ карда мешаванд. Умуман, ҷодугарӣ дар ин ҷо рӯй медиҳад. Хондани мақолаи зерин дар бораи коромӯзон ҷолиб аст: https://habr.com/post/79913/#comment_2345814 Ва ин як идеяи хуб ба назар мерасад. Аммо ин ба мо чӣ гуна таъсир мерасонад? Аммо он воқеан таъсир хоҳад дошт)
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal");
    System.out.println(test == test2);
}
Тавре ки шумо мебинед, сатрҳо якхелаанд, аммо натиҷа нодуруст хоҳад буд. Ва ҳама аз он сабаб, ки == на аз рӯи арзиш, балки аз рӯи истинод муқоиса мекунад. Ва ин тавр кор мекунад:
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test == test2);
}
Танҳо қайд кунед, ки мо то ҳол String нав хоҳем кард. Яъне, таҷрибаомӯз ба мо Стрингро аз кэш бармегардонад, аммо Стринги аслӣ, ки мо дар кэш ҷустуҷӯ кардем, барои тоза кардан партофта мешавад, зеро дар бораи вай дигар касе намедонад. Ин бешубҳа истеъмоли нолозими захираҳо аст =( Аз ин рӯ, шумо бояд ҳамеша сатрҳоро бо истифода аз баробар муқоиса кунед, то хатогиҳои ногаҳонӣ ва душворро то ҳадди имкон пешгирӣ кунед.
public static void main(String[] args) {
    String test = "literal";
    String test2 = new String("literal").intern();
    System.out.println(test.equals(test2));
}
Equals муқоисаи сатри аломат ба аломатро иҷро мекунад.

Пайвастшавӣ

Тавре ки мо дар хотир дорем, сатрҳо метавонанд илова карда шаванд. Ва чунон ки мо дар хотир дорем, сатрҳои мо тағирнопазиранд. Пас он чӣ гуна кор мекунад? Дуруст аст, сатри нав сохта мешавад, ки аз рамзҳои an objectҳои иловашуда иборат аст. Як миллион versionи он вуҷуд дорад, ки чӣ тавр пайвастшавии плюс кор мекунад. Баъзехо гумон мекунанд, ки хар дафъа an objectи нав пайдо мешавад, дигарон гумон мекунанд, ки чизи дигар пайдо мешавад. Аммо танҳо як нафар метавонад ҳақ бошад. Ва он касе, ки компилятори javac аст. Биёед аз хидмати компилятори онлайн истифода кунем ва иҷро кунем:
public class HelloWorld {

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

}
Акнун биёед инро ҳамчун бойгонии zip захира кунем, онро ба директория барорем ва иҷро кунем: javap –c HelloWorld Ва дар ин ҷо мо ҳама чизро мефаҳмем:
Сатрҳо дар Java (синфи java.lang.String) - 3
Дар як ҳалқа, албатта, беҳтар аст, ки пайвасткуниро тавассути StringBuilder худатон анҷом диҳед. Ва на аз сабаби ягон намуди ҷодугарӣ, балки ба тавре ки StringBuilder пеш аз давра сохта мешавад ва дар худи давра танҳо замима рух медиҳад. Дар омади гап, дар ин ҷо боз як чизи ҷолиб вуҷуд дорад. Мақолаи олӣ вуҷуд дорад: " Коркарди сатр дар Java. Қисми I: String, StringBuffer, StringBuilder ." Бисёр маълумоти муфид дар шарҳҳо. Масалан, муайян карда шудааст, ки ҳангоми пайваст кардани намоиш, new StringBuilder().append()...toString()оптимизатсияи дохилӣ амал мекунад, ки аз ҷониби опсияи -XX:+OptimizeStringConcat танзим карда мешавад, ки бо нобаёнӣ фаъол аст. intrinsic - ҳамчун "дохилӣ" тарҷума шудааст. JVM чунин корҳоро ба таври махсус коркард мекунад ва онҳоро ҳамчун Native коркард мекунад, танҳо бе хароҷоти иловагии JNI. Муфассалтар: " Усулҳои дохилӣ дар HotSpot VM ".

StringBuilder ва StringBuffer

Тавре ки мо дар боло дидем, StringBuilder воситаи хеле муфид аст. Сатрҳо тағирнопазиранд, яъне. тагйирнопазир. Ва ман мехоҳам онро пӯшам. Аз ин рӯ, ба мо ду синф дода мешавад, ки ба мо кӯмак кунанд: StringBuilder ва StringBuffer. Фарқи асосии байни ин ду дар он аст, ки StringBuffer дар JDK1.0 ҷорӣ карда шудааст, дар ҳоле ки StringBuilder дар java 1.5 ҳамчун versionи ҳамоҳангнашудаи StringBuffer барои бартараф кардани хароҷоти афзояндаи ҳамоҳангсозии усули нолозим омадааст. Ҳардуи ин синфҳо татбиқи синфи абстрактии AbstractStringBuilder - пайдарпаии тағйирёбандаи аломатҳо мебошанд. Дар дохor он як қатор тӯморҳо нигоҳ дошта мешавад, ки мувофиқи қоида васеъ карда мешавад: value.length * 2 + 2. Ба таври нобаёнӣ, андозаи (иқтидори) StringBuilder 16 аст.

Муқоисашаванда

Сатрҳо муқоисашавандаанд, яъне. усули муқоисаро татбиқ кунед. Ин бо истифода аз муқоисаи аломат ба аломат анҷом дода мешавад. Ҷолиб он аст, ки дарозии ҳадди ақал аз ду сатр интихоб карда мешавад ва дар болои он ҳалқа иҷро карда мешавад. Аз ин рӯ, compareTo ё фарқияти байни арзишҳои int аломатҳои аввалини номувофиқро то ҳадди хурдтарин дарозии сатр бармегардонад ё фарқияти байни дарозии сатрро бармегардонад, агар ҳамаи аломатҳо дар доираи ҳадди ақали сатр мувофиқат кунанд. Ин муќоисаро «лексикографї» меноманд.

Кор бо сатрҳои Java

String дорои усулҳои зиёди муфид аст:
Сатрҳо дар Java (синфи java.lang.String) - 4
Барои кор бо сатрҳо вазифаҳои зиёде мавҷуданд. Масалан, дар Coding Bat . Инчунин курси курсӣ вуҷуд дорад: " Алгоритмҳо дар сатрҳо ".

Хулоса

Ҳатто шарҳи мухтасари ин синф миқдори таъсирбахши ҷойро ишғол мекунад. Ва ин ҳама нест. Ман тавсия медиҳам, ки гузоришро аз JPoint 2015 тамошо кунед: Алексей Шипилев - Catechism java.lang.String
#Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION