JavaRush /Blog Jawa /Random-JV /Pambuka kanggo String, StringBuffer lan StringBuilder ing...

Pambuka kanggo String, StringBuffer lan StringBuilder ing Jawa

Diterbitake ing grup
Ana telung kelas ing Jawa kanggo nggarap data teks: String , StringBuffer lan StringBuilder . Saben pangembang nemoni sing pertama nalika wiwitan sinau basa kasebut. Apa karo sing isih loro? Apa bedane, lan nalika luwih becik nggunakake siji utawa kelas liyane? Umumé, prabédan ing antarane iku cilik, nanging luwih becik ngerti kabeh ing praktik :) Pambuka String, StringBuffer lan StringBuilder ing Jawa - 1

Kelas string

Kelas iki nggambarake urutan karakter. Kabeh literal string sing ditetepake ing program, kayata "Iki String" minangka conto saka kelas String. String nduweni rong fitur dhasar:
  • iki kelas immutable
  • iki kelas pungkasan
Umumé, kelas String ora bisa duwe anak ( final) lan instance saka kelas ora bisa diowahi sawise nggawe ( immutable). Iki menehi kelas String sawetara kaluwihan penting:
  1. Amarga immutability, kode hash saka conto kelas String di-cache. Ora perlu dievaluasi saben wektu amarga nilai lapangan obyek ora bakal owah sawise digawe. Iki menehi kinerja dhuwur nalika nggunakake kelas iki minangka tombol kanggo HashMap.

  2. Kelas String bisa digunakake ing lingkungan multi-threaded tanpa sinkronisasi tambahan.

  3. Fitur liyane saka kelas String yaiku kakehan +operator " " ing Jawa. Mulane, concatenation (tambahan) strings cukup prasaja:

public static void main(String[] args) {
    String command = "Follow" + " " + "the" + " " + "white" + " " + "rabbit";
    System.out.println(command); // Follow the white rabbit
}
Ing hood, concatenation string dileksanakake dening StringBuilder utawa StringBuffer kelas (ing discretion saka compiler) lan cara append(kita bakal pirembagan bab kelas iki sethitik mengko). Yen kita nambah conto kelas String karo conto kelas liyane, sing terakhir bakal dikurangi dadi perwakilan string:
public static void main(String[] args) {
    Boolean b = Boolean.TRUE;
    String result = "b is " + b;
    System.out.println(result); //b is true
}
Iki properti menarik liyane saka kelas String: obyek saka sembarang kelas bisa matak kanggo perwakilan senar nggunakake cara toString()ditetepake ing kelas Objectlan dipun warisaken dening kabeh kelas liyane. Asring metode toString () ing obyek diarani implisit. Contone, nalika kita nampilake soko ing layar utawa nambah String kanggo obyek saka kelas liyane. Kelas String nduweni siji fitur liyane. Kabeh literal string sing ditetepake ing kode Jawa, kayata "asdf", di-cache ing wektu kompilasi lan ditambahake menyang kolam string sing disebut. Yen kita mbukak kode ing ngisor iki:
String a = "Wake up, Neo";
String b = "Wake up, Neo";

System.out.println(a == b);
Kita bakal weruh bener ing console amarga variabel abener bakal bnuduhake conto sing padha saka kelas String sing ditambahake menyang blumbang senar ing wektu kompilasi. Sing, kedadean beda saka kelas karo Nilai padha ora digawe, lan memori disimpen.

Cacat:

Ora angel ditebak yen kelas String dibutuhake utamane kanggo nggarap senar. Nanging ing sawetara kasus, fitur ing ndhuwur kelas String bisa nguripake saka kaluwihan menyang cacat. Sawise string digawe ing kode Jawa, akeh operasi sing asring ditindakake:
  • Ngonversi strings kanggo macem-macem register;
  • ekstraksi substring;
  • concatenation;
  • lsp.
Ayo ndeleng kode iki:
public static void main(String[] args) {

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

    System.out.println("\"" + s + "\"");
}
Sepisanan, kayane kita mung nerjemahake baris "Wake up, Neo!" kanggo huruf gedhe, dibusak spasi ekstra saka senar iki lan kebungkus ing kuotasi. Nyatane, amarga immutability saka kelas String, minangka asil saka saben operasi, kedadean string anyar digawe lan lawas dibuwak, ngasilaken akeh sampah. Kepiye cara supaya ora mbuwang memori?

Kelas StringBuffer

Kanggo nangani nggawe sampah sauntara amarga modifikasi obyek String, sampeyan bisa nggunakake kelas StringBuffer. Iki mutablekelas, i.e. bisa diganti. Obyek saka kelas StringBuffer bisa ngemot set karakter tartamtu, dawa lan nilai sing bisa diganti kanthi nelpon cara tartamtu. Ayo ndeleng kepiye kelas iki. Kanggo nggawe obyek anyar, gunakake salah sawijining konstruktor, contone:
  • StringBuffer () - bakal nggawe obyek kosong (ora ana karakter).
  • StringBuffer(String str) - bakal nggawe obyek adhedhasar variabel str (ngemot kabeh karakter str ing urutan sing padha)
Laku:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Concatenation string liwat StringBuffer ing Jawa wis rampung nggunakake append. Umumé, metode appending kelas StringBuffer kakehan kanthi cara sing bisa nampa meh kabeh jinis data:
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];
}
Cara kasebut appendngasilake obyek sing diarani (kaya akeh metode liyane), sing ngidini kasebut diarani "rantai". Tuladha ing ndhuwur bisa ditulis kaya mangkene:
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];
}
Kelas StringBuffer nduweni sawetara cara kanggo nggarap senar. Ayo dhaptar sing utama:
  • delete(int start, int end)— mbusak substring karakter wiwit saka posisi start, pungkasanend
  • deleteCharAt(int index)- mbusak karakter ing posisiindex
  • insert(int offset, String str)- nglebokake baris string posisi offset. Cara kasebut insertuga kakehan lan bisa njupuk argumen sing beda
  • replace(int start, int end, String str)- bakal ngganti kabeh karakter saka posisi startkanggo posisi enddeningstr
  • reverse()- mbalikke urutan kabeh karakter
  • substring(int start)- bakal ngasilake substring sing diwiwiti ing posisi start
  • substring(int start, int end)- bakal ngasilake substring wiwit saka posisi startmenyang posisiend
Dhaptar lengkap cara lan konstruktor ana ing dokumentasi resmi . Kepiye cara cara ing ndhuwur? Ayo ndeleng ing laku:
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
    }

Kaluwihan:

  1. Kaya sing wis kasebut, StringBuffer minangka kelas sing bisa diowahi, mula nggarap ora nggawe sampah memori sing padha karo String. Mulane, yen akeh modifikasi ditindakake ing senar, luwih becik nggunakake StringBuffer.

  2. StringBuffer minangka kelas aman thread. Cara kasebut disinkronake lan conto bisa digunakake dening pirang-pirang benang bebarengan.

Cacat:

Ing tangan siji, safety thread kauntungan saka kelas, lan ing tangan liyane, iku kerugian. Cara sing disinkronake luwih alon tinimbang metode sing ora disinkronake. Iki ngendi StringBuilder main. Ayo ngerteni apa jenis kelas Jawa iku - StringBuilder, cara apa lan fitur apa.

Kelas StringBuilder

StringBuilder ing Jawa minangka kelas sing nggambarake urutan karakter. Iku meh padha karo StringBuffer ing kabeh cara kajaba safety thread. StringBuilder nyedhiyakake API sing padha karo StringBuffer. Ayo nduduhake iki nggunakake conto sing wis dikenal, ngganti deklarasi variabel saka StringBufer menyang 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
}
Bentenipun mung StringBuffer punika thread aman lan kabeh cara sing diselarasake, nalika StringBuilder ora. Iki mung fitur. StringBuilder ing Jawa luwih cepet tinimbang StringBuffer amarga metode non-sinkronisasi. Mulane, ing sawetara kasus, kajaba ing lingkungan multi-threaded, iku luwih apik kanggo nggunakake StringBuilder kanggo program Java. Kita ngringkes kabeh ing tabel komparatif saka telung kelas:

String vs StringBuffer vs StringBuilder

String StringBuffer StringBuilder
Kemampuan ngganti Immutable(Ora) mutable(Ya) mutable(Ya)
Extensibility final(Ora) final(Ora) final(Ora)
Keamanan thread Ya, amarga immutability Ya, amarga sinkronisasi Ora
Nalika nggunakake Nalika nggarap senar sing arang diowahi Nalika nggarap strings sing bakal kerep diowahi ing lingkungan multi-Utas Nalika nggarap strings sing bakal kerep diowahi ing lingkungan single-threaded
Sampeyan bisa nyinaoni topik iki kanthi luwih rinci ing tingkat kapindho pencarian Java Multithreading ing kursus JavaRush:
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION