JavaRush /Java блогу /Random-KY /Javaдагы String, StringBuffer жана StringBuilderге киришү...

Javaдагы String, StringBuffer жана StringBuilderге киришүү

Группада жарыяланган
Java тorнде тексттик маалыматтар менен иштөө үчүн үч класс бар: String , StringBuffer жана StringBuilder . Ар бир иштеп чыгуучу биринчиси менен тилди үйрөнүүнүн эң башында жолугат. Калган экөө жөнүндө эмне айтууга болот? Алардын кандай айырмачылыктары бар жана тигил же бул классты качан колдонуу жакшы? Жалпысынан алганда, алардын ортосундагы айырма аз, бирок иш жүзүндө баарын түшүнүү үчүн жакшы :) Javaдагы String, StringBuffer жана StringBuilderге киришүү - 1

Стринг классы

Бул класс символдордун ырааттуулугун билдирет. Программаларда аныкталган бардык сап литералдары, мисалы, "Бул сап" String классынын мисалдары. String эки негизги өзгөчөлүктөргө ээ:
  • бул өзгөрүлгүс класс
  • бул акыркы класс
Жалпысынан, String классында балдар ( final) болушу мүмкүн эмес жана класстын инстанциялары түзүлгөндөн кийин өзгөртүлбөйт ( immutable). Бул String классына бир нече маанилүү артыкчылыктарды берет:
  1. Өзгербестиктен улам, String классынын хэшcodeу кэштелет. Аны ар дайым баалоонун кереги жок, анткени an objectтин талаа маанилери ал түзүлгөндөн кийин эч качан өзгөрбөйт. Бул классты ачкыч катары колдонууда жогорку өндүрүмдүүлүктү берет HashMap.

  2. String классын кошумча синхрондоштуруусуз көп жиптүү чөйрөдө колдонсо болот.

  3. String классынын дагы бир өзгөчөлүгү - ал +Java тorндеги " " операторун ашыкча жүктөйт. Демек, саптарды бириктирүү (кошуу) абдан жөнөкөй:

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жана башка бардык класстар тарабынан мурасталган ыкманы колдонуу менен сап көрсөтүүгө чыгарылышы мүмкүн. Көбүнчө an objectтеги toString() ыкмасы кыйыр түрдө чакырылат. Мисалы, биз экранда бир нерсени көрсөткөндө же башка класстын an objectисине Сапты кошкондо. String классынын дагы бир өзгөчөлүгү бар. Java codeунда аныкталган бардык сап литералдары, мисалы, "asdf" компиляция убагында кэштелет жана саптык бассейн деп аталганга кошулат. Эгерде биз төмөнкү codeду иштетсек:
String a = "Wake up, Neo";
String b = "Wake up, Neo";

System.out.println(a == b);
Биз консолдо чындыкты көрөбүз , анткени өзгөрмөлөр aчындыгында bкомпиляция убагында сап пулуна кошулган String классынын эле инстанциясына кайрылышат. Башкача айтканда, бирдей мааниге ээ класстын ар кандай инстанциялары түзүлбөйт жана эстутум сакталат.

Кемчorктери:

String классы биринчи кезекте саптар менен иштөө үчүн керек экенин божомолдоо кыйын эмес. Бирок кээ бир учурларда, String классынын жогорудагы өзгөчөлүктөрү артыкчылыктардан кемчorктерге айланышы мүмкүн. 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 an objectине өзгөртүүлөрдү киргизүүдөн улам убактылуу таштандыларды түзүүнү башкаруу үчүн, сиз StringBuffer классын колдонсоңуз болот. Бул mutableкласс, б.а. өзгөрмөлүү. StringBuffer классынын an objectи белгилердин белгилүү бир топтомун камтышы мүмкүн, алардын узундугун жана маанисин белгилүү ыкмаларды чакыруу менен өзгөртүүгө болот. Келгиле, бул класс кантип иштээрин карап көрөлү. Жаңы an object түзүү үчүн анын конструкторлорунун бирин колдонуңуз, мисалы:
  • StringBuffer() - бош (белгисиз) an objectти түзөт
  • StringBuffer(String str) - str өзгөрмөнүн негизинде an object түзөт (бир эле ырааттуулукта str бардык символдорун камтыган)
Көнүгүү:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Javaдагы StringBuffer аркылуу сапты бириктирүү append. Жалпысынан алганда, StringBuffer классындагы ыкма appendдээрлик бардык маалымат түрүн кабыл ала тургандай ашыкча жүктөлгөн:
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өзү чакырган an 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
Методдордун жана конструкторлордун толук тизмеси расмий documentтерде . Жогорудагы ыкмалар кантип иштейт? Келгиле, иш жүзүндө карап көрөлү:
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 жип коопсуз класс болуп саналат. Анын ыкмалары синхрондоштурулган жана инстанциялар бир эле учурда бир нече жиптер тарабынан колдонулушу мүмкүн.

Кемчorктери:

Бир жагынан жиптин коопсуздугу класстын артыкчылыгы болсо, экинчи жагынан бул кемчorк. Синхрондоштурулган ыкмалар синхрондоштурулган эмес методдорго караганда жайыраак. Бул жерде StringBuilder иштей баштайт. Келгиле, бул кандай Java классы экенин аныктап көрөлү - StringBuilder, анын кандай ыкмалары бар жана анын кандай өзгөчөлүктөрү бар.

StringBuilder классы

Java тorндеги 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ди колдонуу жакшы. Биз үч класстын салыштырма tableсында баарын жалпылайбыз:

String vs StringBuffer vs StringBuilder

String StringBuffer StringBuilder
Өзгөртүү Immutable(Жок) mutable(Ооба) mutable(Ооба)
Кеңейтүү final(Жок) final(Жок) final(Жок)
Жиптин коопсуздугу Ооба, өзгөрүлбөстөн улам Ооба, синхрондоштуруудан улам Жок
Качан колдонуу керек сейрек өзгөртүлө турган саптар менен иштөөдө Көп жиптүү чөйрөдө тез-тез өзгөртүлүп турган саптар менен иштөөдө Бир жиптүү чөйрөдө тез-тез өзгөртүлүп турган саптар менен иштөөдө
Бул теманы JavaRush курсунун Java Multithreading квестинин экинчи деңгээлинде кененирээк изилдей аласыз:
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION