JavaRush /Java блогы /Random-KK /Java тіліндегі String, StringBuffer және StringBuilder ба...

Java тіліндегі String, StringBuffer және StringBuilder бағдарламаларына кіріспе

Топта жарияланған
Java тілінде мәтіндік деректермен жұмыс істеуге арналған үш класс бар: String , StringBuffer және StringBuilder . Әрбір әзірлеуші ​​тілді үйренудің ең басында біріншісіне тап болады. Ал қалған екеуі ше? Олардың айырмашылықтары қандай және бір немесе басқа сыныпты қашан қолданған дұрыс? Жалпы, олардың арасындағы айырмашылық аз, бірақ бәрін іс жүзінде түсінген дұрыс :) Java тіліндегі String, StringBuffer және StringBuilder бағдарламаларына кіріспе - 1

Жол сыныбы

Бұл класс таңбалар тізбегін білдіреді. «Бұл жол» сияқты бағдарламаларда анықталған барлық жол литералдары String сыныбының даналары болып табылады. Жолдың екі негізгі қасиеті бар:
  • бұл өзгермейтін класс
  • бұл соңғы сынып
Жалпы, String сыныбында балалар ( final) болуы мүмкін емес және класс даналары жасалғаннан кейін өзгертілмейді ( immutable). Бұл String класына бірнеше маңызды артықшылықтар береді:
  1. Өзгермейтіндіктен String класының данасы хэшcodeы кэштеледі. Оны әр уақытта бағалаудың қажеті жоқ, себебі нысанның өріс мәндері ол жасалғаннан кейін ешқашан өзгермейді. Бұл класс үшін кілт ретінде пайдаланған кезде жоғары өнімділік береді HashMap.

  2. String класын қосымша үндестірусіз көп ағынды ортада пайдалануға болады.

  3. String класының тағы бір ерекшелігі - ол +Java тіліндегі " " операторын шамадан тыс жүктейді. Сондықтан жолдарды біріктіру (қосу) өте қарапайым:

public static void main(String[] args) {
    String command = "Follow" + " " + "the" + " " + "white" + " " + "rabbit";
    System.out.println(command); // Follow the white rabbit
}
Капот астында жолды біріктіру StringBuilder немесе StringBuffer класы (компилятордың қалауы бойынша) және әдіс append(бұл сыныптар туралы сәл кейінірек айтамыз) арқылы орындалады. Егер String класының даналарын басқа сыныптардың даналарымен қосатын болсақ, соңғысы жол көрінісіне дейін азаяды:
public static void main(String[] args) {
    Boolean b = Boolean.TRUE;
    String result = "b is " + b;
    System.out.println(result); //b is true
}
Бұл String сыныбының тағы бір қызықты қасиеті: кез келген сыныптың нысандарын toString()сыныпта анықталған әдісті пайдаланып жол көрінісіне шығаруға болады Objectжәне барлық басқа сыныптар мұраға алады. Көбінесе нысандағы toString() әдісі жасырын түрде шақырылады. Мысалы, экранда бірдеңені көрсеткенде немесе басқа сыныптың an objectісіне Жолды қосқанда. String класының тағы бір мүмкіндігі бар. "asdf" сияқты Java codeында анықталған барлық жол литералдары компиляция уақытында кэштеледі және жол пулы деп аталатынға қосылады. Келесі codeты іске қосатын болсақ:
String a = "Wake up, Neo";
String b = "Wake up, Neo";

System.out.println(a == b);
Біз консольде true көреміз , себебі айнымалы мәндер компиляция уақытында жол пулына қосылған String сыныбының бірдей данасына сілтеме жасайды a. bЯғни, бірдей мәнге ие класстың әртүрлі даналары жасалмайды, жады сақталады.

Кемшіліктері:

String класы ең алдымен жолдармен жұмыс істеу үшін қажет екенін болжау қиын емес. Бірақ кейбір жағдайларда String класының жоғарыдағы мүмкіндіктері артықшылықтардан кемшіліктерге айналуы мүмкін. Java codeында жолдар жасалғаннан кейін олармен жиі көптеген операциялар орындалады:
  • жолдарды әртүрлі регистрлерге түрлендіру;
  • ішкі жолды шығару;
  • жалғау;
  • және т.б.
Мына codeты қарастырайық:
public static void main(String[] args) {

    String s = " Wake up, Neo! ";
    s = s.toUpperCase();
    s = s.trim();

    System.out.println("\"" + s + "\"");
}
Бір қарағанда «Оян, Нео!» деген жолды жаңа ғана аударған сияқтымыз. бас әріптерге, осы жолдан қосымша бос орындарды алып тастап, оны тырнақшаға ораңыз. Шын мәнінде, String класының өзгермейтіндігіне байланысты, әрбір операцияның нәтижесінде жаңа жол даналары жасалады және ескілері жойылып, үлкен көлемдегі қоқыс тудырады. Жадты ысырап етуді қалай болдырмауға болады?

StringBuffer сыныбы

String нысанындағы өзгертулерге байланысты уақытша қоқысты жасауды өңдеу үшін StringBuffer сыныбын пайдалануға болады. Бұл mutableсынып, яғни. өзгермелі. StringBuffer класының an objectісі белгілі бір әдістерді шақыру арқылы ұзындығы мен мәнін өзгертуге болатын белгілі бір символдар жиынын қамтуы мүмкін. Бұл сынып қалай жұмыс істейтінін көрейік. Жаңа нысан жасау үшін оның конструкторларының бірін пайдаланыңыз, мысалы:
  • StringBuffer() - бос (таңбасыз) нысан жасайды
  • StringBuffer(String str) - str айнымалысы негізінде нысан жасайды (бір реттіліктегі str барлық таңбаларын қамтитын)
Тәжірибе:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Java тіліндегі StringBuffer арқылы жолды біріктіру append. Жалпы, appendStringBuffer класындағы әдіс кез келген дерлік деректер түрін қабылдай алатындай шамадан тыс жүктеледі:
public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();

    sb.append(new Integer(2));
    sb.append("; ");
    sb.append(false);
    sb.append("; ");
    sb.append(Arrays.asList(1,2,3));
    sb.append("; ");

    System.out.println(sb); // 2; false; [1, 2, 3];
}
Әдіс appendөзі шақырылған нысанды қайтарады (көптеген басқа әдістер сияқты), бұл оны «тізбекте» шақыруға мүмкіндік береді. Жоғарыдағы мысалды былай жазуға болады:
public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();

    sb.append(new Integer(2))
            .append("; ")
            .append(false)
            .append("; ")
            .append(Arrays.asList(1,2,3))
            .append("; ");

    System.out.println(sb); // 2; false; [1, 2, 3];
}
StringBuffer класында жолдармен жұмыс істеудің бірнеше әдістері бар. Негізгілерін атап өтейік:
  • delete(int start, int end)— позициядан басталып start, аяқталатын таңбалардың ішкі жолын жоядыend
  • deleteCharAt(int index)— позициядағы таңбаны жоядыindex
  • insert(int offset, String str)str— позициясына сызық енгізеді offset. Әдіс insertшамадан тыс жүктелген және әртүрлі аргументтерді қабылдай алады
  • replace(int start, int end, String str)- барлық таңбаларды позициядан startпозицияға ауыстырадыendstr
  • reverse()— барлық таңбалардың ретін өзгертеді
  • substring(int start)- позициядан басталатын ішкі жолды қайтарады start
  • substring(int start, int end)start- позициядан позицияға басталатын ішкі жолды қайтарадыend
Әдістер мен конструкторлардың толық тізімі ресми құжаттамада . Жоғарыда аталған әдістер қалай жұмыс істейді? Іс жүзінде көрейік:
public static void main(String[] args) {
     String numbers = "0123456789";

     StringBuffer sb = new StringBuffer(numbers);

     System.out.println(sb.substring(3)); // 3456789
     System.out.println(sb.substring(4, 8)); // 4567
     System.out.println(sb.replace(3, 5, "ABCDE")); // 012ABCDE56789

     sb = new StringBuffer(numbers);
     System.out.println(sb.reverse()); // 9876543210
     sb.reverse(); // Return the original order

     sb = new StringBuffer(numbers);
     System.out.println(sb.delete(5, 9)); // 012349
     System.out.println(sb.deleteCharAt(1)); // 02349
     System.out.println(sb.insert(1, "One")); // 0One2349
    }

Артықшылықтары:

  1. Жоғарыда айтылғандай, StringBuffer өзгермелі класс болып табылады, сондықтан онымен жұмыс істеу String сияқты жад қоқыс көлемін жасамайды. Сондықтан, егер жолдарға көптеген модификациялар жасалса, оны қолданған дұрыс StringBuffer.

  2. StringBuffer - ағынды қауіпсіз класс. Оның әдістері синхрондалады және даналарды бірнеше ағындар бір уақытта пайдалана алады.

Кемшіліктері:

Бір жағынан, жіптің қауіпсіздігі сыныптың артықшылығы, ал екінші жағынан, бұл кемшілік. Синхрондалған әдістер синхрондалмаған әдістерге қарағанда баяу. Бұл жерде StringBuilder іске қосылады. Оның қандай Java класы - StringBuilder, оның қандай әдістері бар және оның мүмкіндіктері қандай екенін анықтайық.

StringBuilder сыныбы

Java тіліндегі StringBuilder - бұл таңбалар тізбегін көрсететін класс. Ол жіп қауіпсіздігінен басқа барлық жағынан StringBuffer-ге өте ұқсас. StringBuilder StringBuffer сияқты API ұсынады. Мұны бұрыннан таныс мысалды пайдаланып, айнымалылар декларациясын StringBufer-тен StringBuilder-ге ауыстырып көрсетейік:
public static void main(String[] args) {
    String numbers = "0123456789";

    StringBuilder sb = new StringBuilder(numbers);

    System.out.println(sb.substring(3)); //3456789
    System.out.println(sb.substring(4, 8)); //4567
    System.out.println(sb.replace(3, 5, "ABCDE")); //012ABCDE56789

    sb = new StringBuilder(numbers);
    System.out.println(sb.reverse()); //9876543210
    sb.reverse(); // Return the original order

    sb = new StringBuilder(numbers);
    System.out.println(sb.delete(5, 9)); //012349
    System.out.println(sb.deleteCharAt(1)); //02349
    System.out.println(sb.insert(1, "One")); //0One2349
}
Жалғыз айырмашылық StringBuffer ағыны қауіпсіз және оның барлық әдістері синхрондалған, ал StringBuilder жоқ. Бұл жалғыз қасиет. Java тіліндегі StringBuilder әдістері синхрондалмағандықтан StringBuffer-ге қарағанда жылдамырақ. Сондықтан көп ағынды ортаны қоспағанда, көп жағдайда Java бағдарламасы үшін StringBuilder қолданған дұрыс. Біз барлығын үш сыныптың салыстырмалы кестесінде қорытындылаймыз:

String және StringBuffer және StringBuilder

Жол StringBuffer StringBuilder
Өзгергіштік Immutable(Жоқ) mutable(Иә) mutable(Иә)
Кеңейтімділік final(Жоқ) final(Жоқ) final(Жоқ)
Жіп қауіпсіздігі Иә, өзгермейтіндіктен Иә, синхрондау арқасында Жоқ
Қашан пайдалану керек Сирек өзгертілетін жолдармен жұмыс істегенде Көп ағынды ортада жиі өзгертілетін жолдармен жұмыс істегенде Бір ағынды ортада жиі өзгертілетін жолдармен жұмыс істегенде
Сіз бұл тақырыпты JavaRush курсындағы Java Multithreading квестінің екінші деңгейінде толығырақ оқи аласыз:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION