JavaRush /Java Blog /Random-TK /Java-da String, StringBuffer we StringBuilder bilen tanyş...

Java-da String, StringBuffer we StringBuilder bilen tanyşlyk

Toparda çap edildi
Java-da tekst maglumatlary bilen işlemek üçin üç synp bar: String , StringBuffer we StringBuilder . Her bir dörediji, dil öwrenmegiň başynda birinjisine duşýar. Galan ikisi näme? Olaryň tapawudy näme we haçan bir ýa-da başga bir synpy ulanmak has gowudyr? Umuman, olaryň arasyndaky tapawut az, ýöne iş ýüzünde hemme zada düşünmek has gowudyr :) Java-da String, StringBuffer we StringBuilder bilen tanyşlyk - 1

Setir synpy

Bu synp nyşanlaryň yzygiderliligini görkezýär. "Bu setir" ýaly programmalarda kesgitlenen ähli setir söz düzümleri String synpynyň mysallarydyr. Setiriň iki esasy aýratynlygy bar:
  • bu üýtgewsiz synp
  • bu soňky synp
Umuman aýdanyňda, Setir synpynda çagalar bolup bilmez ( final) we döredilenden soň synpyň ýagdaýlaryny üýtgedip bolmaz immutable. Bu String synpyna birnäçe möhüm artykmaçlygy berýär:
  1. Üýtgemezlik sebäpli, String synpynyň mysalynyň hashkody keş görnüşinde saklanýar. Her gezek baha bermegiň zerurlygy ýok, sebäbi obýektiň meýdan bahalary döredilenden soň üýtgemez. Bu synpy açar hökmünde ulananyňyzda ýokary öndürijilik berýär HashMap.

  2. Setir synpy goşmaça sinhronizasiýa bolmazdan köp sapakly gurşawda ulanylyp bilner.

  3. +String synpynyň başga bir aýratynlygy , Java-daky "" operatory aşa ýüklemekdir . Şonuň üçin setirleriň birleşmegi (goşulmagy) gaty ýönekeý:

public static void main(String[] args) {
    String command = "Follow" + " " + "the" + " " + "white" + " " + "rabbit";
    System.out.println(command); // Follow the white rabbit
}
Kapotyň aşagynda simli birleşme StringBuilder ýa-da StringBuffer synpy (düzüjiniň islegi boýunça) we usul append(bu sapaklar barada biraz soňrak gürleşeris) tarapyndan ýerine ýetirilýär. String synpynyň mysallaryny beýleki synplaryň mysallary bilen goşsak, ikinjisi setir şekiline çenli azalýar:
public static void main(String[] args) {
    Boolean b = Boolean.TRUE;
    String result = "b is " + b;
    System.out.println(result); //b is true
}
Bu “String” synpynyň başga bir gyzykly aýratynlygy: islendik synpyň obýektleri toString()synpda kesgitlenen Objectwe beýleki synplara miras galan usuly ulanyp, setir şekillendirilip bilner. Köplenç obýektdäki toString () usulyna aç-açan diýilýär. Mysal üçin, ekranda bir zat görkezenimizde ýa-da başga bir synpyň obýektine setir goşanymyzda. Setir synpynyň ýene bir aýratynlygy bar. Java kodunda kesgitlenen "asdf" ýaly ähli söz sözlemleri, kompil wagtynda keş görnüşinde saklanýar we setir basseýnine goşulýar. Aşakdaky kody işleden bolsak:
String a = "Wake up, Neo";
String b = "Wake up, Neo";

System.out.println(a == b);
Konsolda hakykaty göreris , sebäbi üýtgeýjiler aaslynda bdüzüliş wagtynda setir basseýnine goşulan String synpyna meňzeýär. .Agny, birmeňzeş gymmaty bolan synpyň dürli mysallary döredilmeýär we ýat ýatda saklanýar.

Kemçilikler:

Setir synpynyň esasan setirler bilen işlemek üçin zerurdygyny çaklamak kyn däl. Someöne käbir ýagdaýlarda String synpynyň ýokardaky aýratynlyklary artykmaçlyklardan kemçiliklere öwrülip biler. Java kodunda setirler döredilenden soň, köplenç köp amallar ýerine ýetirilýär:
  • setirleri dürli registrlere öwürmek;
  • substrat gazyp almak;
  • birleşme;
  • we ş.m.
Geliň şu koda seredeliň:
public static void main(String[] args) {

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

    System.out.println("\"" + s + "\"");
}
Bir seretseň, ýaňy “Oýan, Neo!” Setirini terjime eden ýaly. baş harp bilen, bu setirden goşmaça boşluklary aýyrdy we sitata bilen örtdi. Aslynda, String synpynyň üýtgewsizligi sebäpli, her bir işiň netijesinde täze setir mysallary döredilýär we köne zatlary taşlanýar, köp mukdarda zibil döredýär. Memoryadyň ýitirilmeginden nädip saklanmaly?

StringBuffer synpy

String obýektine üýtgeşmeler sebäpli wagtlaýyn hapalaryň döredilmegi üçin “StringBuffer” synpyny ulanyp bilersiňiz. Bu mutablesynp, ýagny üýtgedilip bilner. “StringBuffer” synpynyň obýekti belli bir usullary çagyryp, uzynlygy we gymmaty üýtgedilip bilinjek belli bir nyşan toplumyny öz içine alyp biler. Geliň, bu synpyň nähili işleýändigini göreliň. Täze obýekt döretmek üçin, gurluşykçylaryndan birini ulanyň, mysal üçin:
  • StringBuffer () - boş (nyşan ýok) obýekt döreder
  • StringBuffer (String str) - str üýtgeýjisine esaslanýan bir obýekt döreder (şol bir hatarda str nyşanlarynyň hemmesini öz içine alýar)
Amal:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Java-da StringBuffer arkaly setir birikmesi append. Umuman aýdanyňda, “StringBuffer” synpyndaky usul, appendislendik maglumat görnüşini diýen ýaly kabul edip biljek derejede aşa ýüklenýär:
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];
}
Usul append, “zynjyrda” çagyrylmagyna mümkinçilik berýän (beýleki usullar ýaly) atlandyrylan obýekti yzyna gaýtaryp berýär. Aboveokardaky mysaly şeýle ýazyp bolar:
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” synpynda setirler bilen işlemek üçin birnäçe usul bar. Esasylaryny sanap geçeliň:
  • delete(int start, int end)- pozisiýadan başlap start, soňuna çenli nyşanlaryň aşaky bölegini pozýarend
  • deleteCharAt(int index)- nyşanlary pozýarindex
  • insert(int offset, String str)str- ýerinde çyzyk goýýar offset. Usul inserthem aşa ýüklenýär we dürli argumentleri alyp biler
  • replace(int start, int end, String str)- hemme nyşanlary pozisiýadan startpozisiýa çalyşarendstr
  • reverse()- ähli nyşanlaryň tertibini tersleşdirýär
  • substring(int start)- ýagdaýdan başlap substringi yzyna getirer start
  • substring(int start, int end)start- pozisiýadan başlap, aşaky bölegi yzyna getirerend
Usullaryň we konstruktorlaryň doly sanawy resmi resminamalarda . Aboveokardaky usullar nähili işleýär? Iş ýüzünde göreliň:
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
    }

Üstünlikleri:

  1. Öň bellenip geçilişi ýaly, StringBuffer üýtgäp bilýän synpdyr, şonuň üçin onuň bilen işlemek String bilen deň mukdarda ýat hapalaryny döretmeýär. Şonuň üçin setirlere köp üýtgetmeler girizilen bolsa, ulanmak has gowudyr StringBuffer.

  2. StringBuffer sapak üçin ygtybarly synpdyr. Onuň usullary sinhronlaşdyrylýar we mysallar bir wagtyň özünde birnäçe sapak arkaly ulanylyp bilner.

Kemçilikler:

Bir tarapdan, sapaklaryň howpsuzlygy synpyň artykmaçlygy, beýleki tarapdan bolsa zyýany. Sinhronlaşdyrylan usullar sinhron däl usullardan has haýal. “StringBuilder” şu ýerde oýnaýar. “Java” synpynyň haýsydygyny - “StringBuilder”, haýsy usullaryň bardygyny we aýratynlyklarynyň nämedigini anyklalyň.

StringBuilder synpy

Java-daky StringBuilder, nyşanlaryň yzygiderliligini görkezýän synpdyr. Sapyň howpsuzlygyndan başga hemme taraplaýyn StringBuffer-e gaty meňzeýär. StringBuilder, StringBuffer-e meňzeş API üpjün edýär. Geliň, StringBufer-den StringBuilder-e üýtgeýänleriň deklarasiýasyny çalşyp, eýýäm tanyş bir mysal ulanyp görkezeliň:
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
}
Onlyeke-täk tapawut, StringBuffer sapaklaryň howpsuz bolmagy we ähli usullary sinhronlaşdyrylmagy, StringBuilder bolsa ýok. Bu ýeke-täk aýratynlyk. Java-da StringBuilder, usullaryň sinhronlaşmazlygy sebäpli StringBuffer-den has çalt. Şonuň üçin köp halatlarda, köp sapakly gurşawdan başga ýagdaýlarda, Java programmasy üçin StringBuilder-den peýdalanmak has gowudyr. Üç synpyň deňeşdirme tablisasynda hemme zady jemleýäris:

String vs StringBuffer vs StringBuilder

Setir StringBuffer StringBuilder
Üýtgeýänlik Immutable() Ok) mutable(Hawa) mutable(Hawa)
Giňeldiş final() Ok) final() Ok) final() Ok)
Tekstiň howpsuzlygy Hawa, üýtgewsizlik sebäpli Hawa, sinhronizasiýa sebäpli .Ok
Haçan ulanmaly Seýrek üýtgediljek setirler bilen işlenende Köp sapakly gurşawda ýygy-ýygydan üýtgediljek setirler bilen işlenende Bir sapakly gurşawda ýygy-ýygydan üýtgediljek setirler bilen işlenende
Bu mowzugy JavaRush kursunda Java Multithreading gözleginiň ikinji derejesinde has jikme-jik öwrenip bilersiňiz:
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION