JavaRush /Блоги Java /Random-TG /Муқаддима ба String, StringBuffer ва StringBuilder дар Ja...

Муқаддима ба String, StringBuffer ва StringBuilder дар Java

Дар гурӯҳ нашр шудааст
Дар Java се синф барои кор бо додаҳои матнӣ вуҷуд дорад: String , StringBuffer ва StringBuilder . Ҳар як таҳиягар дар ибтидои омӯзиши забон бо аввалинаш дучор мешавад. Дар бораи ду нафари боқимонда чӣ гуфтан мумкин аст? Фарқиятҳои онҳо чист ва кай истифода бурдани ин ё он синф беҳтар аст? Умуман, фарқияти байни онҳо хурд аст, аммо беҳтар аст, ки ҳама чизро дар амал фаҳмед :) Муқаддима ба String, StringBuffer ва StringBuilder дар Java - 1

Синфи сатр

Ин синф пайдарпаии аломатҳоро ифода мекунад. Ҳама адабии сатри дар барномаҳо муайяншуда, ба монанди "Ин сатр аст" мисолҳои синфи String мебошанд. Сатр ду хусусияти асосӣ дорад:
  • ин синфи тағйирнопазир аст
  • ин синфи ниҳоӣ аст
Умуман, синфи String наметавонад фарзанд дошта бошад ( final) ва мисолҳои синфро пас аз эҷод ( immutable) тағир додан мумкин нест. Ин ба синфи String якчанд бартариҳои муҳим медиҳад:
  1. Аз сабаби тағирнопазирӣ, хэшcodeи намунаи синфи String кэш карда мешавад. Онро ҳар дафъа арзёбӣ кардан лозим нест, зеро арзишҳои майдони an object пас аз сохтани он ҳеҷ гоҳ тағир намеёбанд. Ин ҳангоми истифодаи ин синф ҳамчун калид барои 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 аст: an objectҳои ҳама гуна синфро бо истифода аз усули toString()дар синф муайяншуда Objectва аз ҷониби ҳамаи синфҳои дигар мерос гирифташуда ба намоиши сатр андохтан мумкин аст. Аксар вақт усули toString() дар an object ба таври ғайримустақим номида мешавад. Масалан, вақте ки мо чизеро дар экран нишон медиҳем ё ба an objectи синфи дигар String илова мекунем. Синфи String боз як хусусият дорад. Ҳамаи адабии сатри дар codeи Java муайяншуда, ба монанди "asdf", дар вақти тартибдиҳӣ кэш карда мешаванд ва ба ҳавзи ба истилоҳ сатр илова карда мешаванд. Агар мо рамзи зеринро иҷро кунем:
String a = "Wake up, Neo";
String b = "Wake up, Neo";

System.out.println(a == b);
Мо ҳақиқиро дар консол хоҳем дид , зеро тағирёбандаҳо aвоқеан bба ҳамон мисоли синфи String, ки дар вақти компиляция ба ҳавзи сатр илова шуда буданд, ишора мекунанд. Яъне мисолҳои гуногуни синф бо арзиши якхела сохта намешаванд ва хотира захира карда мешавад.

Камбудиҳо:

Тахмин кардан душвор нест, ки синфи String асосан барои кор бо сатр лозим аст. Аммо дар баъзе мавридҳо, хусусиятҳои дар боло зикршудаи синфи String метавонанд аз афзалиятҳо ба камбудиҳо табдил ёбанд. Вақте ки сатрҳо дар codeи Java сохта мешаванд, аксар вақт дар онҳо амалҳои зиёде иҷро карда мешаванд:
  • табдил додани сатрҳо ба регистрҳои гуногун;
  • истихроҷи зерсатр;
  • пайвастшавӣ;
  • ва гайра.
Биёед ин codeро бубинем:
public static void main(String[] args) {

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

    System.out.println("\"" + s + "\"");
}
Дар назари аввал, чунин менамояд, ки мо наваHow сатри «Бедор шав, Нео!»-ро тарчума кардаем. ба ҳарфҳои калон, фосилаҳои иловагӣ аз ин сатр хориҷ карда, онро дар нохунак печонд. Дарвоқеъ, аз сабаби тағирнопазирии синфи String, дар натиҷаи ҳар як амал, мисолҳои сатри нав сохта мешаванд ва кӯҳнаҳо партофта мешаванд, ки миқдори зиёди партовҳоро тавлид мекунанд. Чӣ тавр аз талафоти хотира пешгирӣ кардан мумкин аст?

Синфи StringBuffer

Барои коркарди эҷоди партовҳои муваққатӣ бо сабаби тағир додани an objectи String, шумо метавонед синфи StringBuffer -ро истифода баред. Ин mutableсинф аст, яъне. тағйирёбанда. Объекти синфи StringBuffer метавонад маҷмӯи мушаххаси аломатҳоро дар бар гирад, ки дарозӣ ва арзиши онҳоро тавассути даъват кардани усулҳои муайян тағир додан мумкин аст. Биёед бубинем, ки ин синф чӣ гуна кор мекунад. Барои сохтани an objectи нав яке аз конструкторҳои онро истифода баред, масалан:
  • StringBuffer() - an objectи холӣ (бе аломат) эҷод мекунад
  • StringBuffer(String str) - an objectро дар асоси тағирёбандаи str эҷод мекунад (ҳамаи аломатҳои str дар як пайдарпаӣ дорад)
Амал:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Пайвасткунии сатр тавассути StringBuffer дар Java бо истифода аз append. Умуман, усул appendдар синфи StringBuffer тавре пурбор карда шудааст, ки он метавонад қариб ҳама намуди маълумотро қабул кунад:
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];
}
Усул appendan objectеро, ки дар он номида шуда буд, бармегардонад (мисли бисёр усулҳои дигар), ки имкон медиҳад, ки он дар "занҷир" даъват карда шавад. Мисоли болоро метавон чунин навишт:
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

StringBuilder дар Java синфест, ки пайдарпаии аломатҳоро ифода мекунад. Он аз ҳама ҷиҳат ба StringBuffer хеле монанд аст, ба истиснои бехатарии ришта. StringBuilder API-и шабеҳи StringBufferро таъмин мекунад. Биёед инро бо истифода аз як мисоли шинос нишон диҳем ва иваз кардани эъломияи тағирёбандаҳоро аз 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 нест. Ин ягона хусусият аст. StringBuilder дар Java аз сабаби синхронизатсия нашудани усулҳо нисбат ба StringBuffer тезтар аст. Аз ин рӯ, дар аксари мавридҳо, ба истиснои муҳити чанд ришта, беҳтар аст, ки StringBuilder барои барномаи Java истифода шавад. Мо ҳама чизро дар ҷадвали муқоисавии се синф ҷамъбаст мекунем:

String vs StringBuffer vs StringBuilder

Сатр StringBuffer StringBuilder
Тағйирпазирӣ Immutable(Не) mutable(ҳа) mutable(ҳа)
Васеъшавӣ final(Не) final(Не) final(Не)
Бехатарии ришта Бале, аз сабаби тағйирнопазирӣ Бале, аз сабаби синхронизатсия Не
Кай истифода бурдан Ҳангоми кор бо сатрҳо, ки хеле кам тағир дода мешаванд Ҳангоми кор бо сатрҳое, ки дар муҳити бисёрсоҳавӣ зуд-зуд тағир дода мешаванд Ҳангоми кор бо сатрҳое, ки зуд-зуд дар муҳити як ришта тағир дода мешаванд
Шумо метавонед ин мавзӯъро дар сатҳи дуюми квести Java Multithreading дар курси JavaRush муфассалтар омӯзед:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION