JavaRush /Java blogi /Random-UZ /Java-da String, StringBuffer va StringBuilder-ga kirish

Java-da String, StringBuffer va StringBuilder-ga kirish

Guruhda nashr etilgan
Java-da matnli ma'lumotlar bilan ishlash uchun uchta sinf mavjud: String , StringBuffer va StringBuilder . Har bir dasturchi tilni o'rganishning boshida birinchisiga duch keladi. Qolgan ikkitasi haqida nima deyish mumkin? Ularning farqlari qanday va u yoki bu sinfdan qachon foydalanish yaxshiroq? Umuman olganda, ular orasidagi farq kichik, lekin amalda hamma narsani tushunish yaxshiroqdir :) Java-da String, StringBuffer va StringBuilder-ga kirish - 1

String sinfi

Bu sinf belgilar ketma-ketligini ifodalaydi. Dasturlarda belgilangan barcha satr literallari, masalan, "Bu String" String sinfining misollari. String ikkita asosiy xususiyatga ega:
  • bu o'zgarmas sinf
  • bu oxirgi sinf
Umuman olganda, String sinfida bolalar ( final) bo'lishi mumkin emas va yaratilgandan so'ng sinf misollarini o'zgartirib bo'lmaydi ( immutable). Bu String sinfiga bir qancha muhim afzalliklarni beradi:
  1. O'zgarmasligi tufayli String klassi namunasining xeshkodi keshlanadi. Uni har safar baholash shart emas, chunki ob'ekt yaratilgandan keyin uning maydon qiymatlari hech qachon o'zgarmaydi. Bu sinfdan kalit sifatida foydalanishda yuqori samaradorlikni beradi HashMap.

  2. String sinfidan qo'shimcha sinxronizatsiyasiz ko'p tarmoqli muhitda foydalanish mumkin.

  3. String sinfining yana bir xususiyati shundaki, u +Java tilidagi " " operatorini ortiqcha yuklaydi. Shuning uchun satrlarni birlashtirish (qo'shish) juda oddiy:

public static void main(String[] args) {
    String command = "Follow" + " " + "the" + " " + "white" + " " + "rabbit";
    System.out.println(command); // Follow the white rabbit
}
Kaput ostida satrlarni birlashtirish StringBuilder yoki StringBuffer klassi (kompilyatorning ixtiyoriga ko'ra) va usul append(bu sinflar haqida biroz keyinroq gaplashamiz) tomonidan amalga oshiriladi. Agar biz String sinfining misollarini boshqa sinflarning misollari bilan qo'shsak, ikkinchisi string tasviriga qisqartiriladi:
public static void main(String[] args) {
    Boolean b = Boolean.TRUE;
    String result = "b is " + b;
    System.out.println(result); //b is true
}
toString()Bu String sinfining yana bir qiziqarli xususiyati: har qanday sinf ob'ektlari sinfda aniqlangan Objectva boshqa barcha sinflar tomonidan meros qilib olingan usul yordamida string tasviriga o'tkazilishi mumkin . Ko'pincha ob'ektdagi toString() usuli bilvosita chaqiriladi. Masalan, biz ekranda biror narsani ko'rsatganimizda yoki boshqa sinf ob'ektiga String qo'shganimizda. String sinfi yana bir xususiyatga ega. Java kodida aniqlangan barcha satr harflari, masalan, "asdf" kompilyatsiya vaqtida keshlanadi va string pul deb ataladigan narsaga qo'shiladi. Agar biz quyidagi kodni ishga tushirsak:
String a = "Wake up, Neo";
String b = "Wake up, Neo";

System.out.println(a == b);
Konsolda biz true ni ko'ramiz , chunki o'zgaruvchilar aaslida bkompilyatsiya vaqtida string puliga qo'shilgan String sinfining bir xil misoliga ishora qiladi. Ya'ni, bir xil qiymatga ega bo'lgan sinfning turli nusxalari yaratilmaydi va xotira saqlanadi.

Kamchiliklari:

String sinfi birinchi navbatda satrlar bilan ishlash uchun kerakligini taxmin qilish qiyin emas. Ammo ba'zi hollarda String sinfining yuqoridagi xususiyatlari afzalliklardan kamchiliklarga aylanishi mumkin. Java kodida satrlar yaratilgandan so'ng, ular bilan ko'p operatsiyalar bajariladi:
  • satrlarni turli registrlarga aylantirish;
  • pastki qatorni ajratib olish;
  • birlashma;
  • va hokazo.
Keling, ushbu kodni ko'rib chiqaylik:
public static void main(String[] args) {

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

    System.out.println("\"" + s + "\"");
}
Bir qarashda, biz “Uyg'on, Neo!” satrini hozirgina tarjima qilganga o'xshaymiz. bosh harfga, bu satrdan qo'shimcha bo'shliqlarni olib tashladi va uni qo'shtirnoq ichiga o'radi. Darhaqiqat, String sinfining o'zgarmasligi tufayli har bir operatsiya natijasida yangi satr misollari yaratiladi va eskilari tashlab yuboriladi, bu esa katta miqdordagi axlatni keltirib chiqaradi. Xotirani yo'qotishdan qanday qochish kerak?

StringBuffer klassi

String ob'ektiga kiritilgan o'zgartirishlar tufayli vaqtinchalik axlatni yaratishni boshqarish uchun siz StringBuffer sinfidan foydalanishingiz mumkin. Bu mutablesinf, ya'ni. o'zgaruvchan. StringBuffer sinfining ob'ekti ma'lum belgilar to'plamini o'z ichiga olishi mumkin, ularning uzunligi va qiymatini ma'lum usullarni chaqirish orqali o'zgartirish mumkin. Keling, bu sinf qanday ishlashini ko'rib chiqaylik. Yangi ob'ekt yaratish uchun uning konstruktorlaridan birini ishlating, masalan:
  • StringBuffer() - bo'sh (belgisiz) ob'ektni yaratadi
  • StringBuffer(String str) - str o'zgaruvchisi asosida ob'ekt yaratadi (bir xil ketma-ketlikda str ning barcha belgilarini o'z ichiga oladi)
Amaliyot:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Java'da StringBuffer orqali satrlarni birlashtirish append. Umuman olganda, StringBuffer sinfidagi usul appenddeyarli har qanday ma'lumot turini qabul qila oladigan tarzda haddan tashqari yuklangan:
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 appendo'zi chaqirilgan ob'ektni qaytaradi (ko'plab boshqa usullar kabi), bu uni "zanjirda" chaqirish imkonini beradi. Yuqoridagi misolni quyidagicha yozish mumkin:
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 sinfida satrlar bilan ishlashning bir qancha usullari mavjud. Keling, asosiylarini sanab o'tamiz:
  • delete(int start, int end)start— pozitsiyadan boshlanib , tugaydigan belgilar qatorini oʻchiradiend
  • deleteCharAt(int index)— joylashuvdagi belgini o'chiradiindex
  • insert(int offset, String str)str— pozitsiyasiga chiziq qo'yadi offset. Usul insertham haddan tashqari yuklangan va turli argumentlarni qabul qilishi mumkin
  • replace(int start, int end, String str)- barcha belgilarni pozitsiyadan startpozitsiyaga almashtiradiendstr
  • reverse()— barcha belgilar tartibini o'zgartiradi
  • substring(int start)- pozitsiyadan boshlanadigan pastki qatorni qaytaradi start
  • substring(int start, int end)start- pozitsiyadan pozitsiyaga boshlanadigan pastki qatorni qaytaradiend
Usullar va konstruktorlarning to'liq ro'yxati rasmiy hujjatlarda . Yuqoridagi usullar qanday ishlaydi? Keling, amalda ko'rib chiqaylik:
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
    }

Afzalliklari:

  1. Yuqorida aytib o'tilganidek, StringBuffer o'zgaruvchan sinfdir, shuning uchun u bilan ishlash String bilan bir xil miqdordagi xotira axlatini yaratmaydi. Shuning uchun, agar satrlarda ko'plab o'zgarishlar amalga oshirilsa, undan foydalanish yaxshiroqdir StringBuffer.

  2. StringBuffer - bu ip xavfsiz sinf. Uning usullari sinxronlashtiriladi va misollar bir vaqtning o'zida bir nechta iplar tomonidan ishlatilishi mumkin.

Kamchiliklari:

Bir tomondan, ipning xavfsizligi sinfning afzalligi, boshqa tomondan, bu kamchilik. Sinxronlashtirilgan usullar sinxronlashtirilmagan usullarga qaraganda sekinroq. Bu erda StringBuilder o'ynaydi. Keling, bu qanday Java klassi - StringBuilder, qanday usullarga ega va uning xususiyatlari qanday ekanligini aniqlaymiz.

StringBuilder klassi

Java-dagi StringBuilder - bu belgilar ketma-ketligini ifodalovchi sinf. U ip xavfsizligidan tashqari hamma narsada StringBuffer-ga juda o'xshaydi. StringBuilder StringBuffer-ga o'xshash API-ni taqdim etadi. Keling, buni StringBufer'dan StringBuilder'ga o'zgaruvchilar deklaratsiyasini almashtirib, tanish misol yordamida ko'rsatamiz:
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
}
Yagona farq shundaki, StringBuffer ip xavfsiz va uning barcha usullari sinxronlashtiriladi, StringBuilder esa bunday emas. Bu yagona xususiyat. Java'dagi StringBuilder, usullarning sinxronlashtirilmaganligi sababli StringBuffer'dan tezroq. Shuning uchun, aksariyat hollarda, ko'p tarmoqli muhitdan tashqari, Java dasturi uchun StringBuilder-dan foydalanish yaxshiroqdir. Biz hamma narsani uchta sinfning qiyosiy jadvalida umumlashtiramiz:

String va StringBuffer va StringBuilder

String StringBuffer StringBuilder
O'zgaruvchanlik Immutable(Yo'q) mutable(Ha) mutable(Ha)
Kengaytirish qobiliyati final(Yo'q) final(Yo'q) final(Yo'q)
Ip xavfsizligi Ha, o'zgarmasligi sababli Ha, sinxronizatsiya tufayli Yo'q
Qachon foydalanish kerak Kamdan-kam hollarda o'zgartiriladigan satrlar bilan ishlashda Ko'p tarmoqli muhitda tez-tez o'zgartiriladigan satrlar bilan ishlashda Bitta ipli muhitda tez-tez o'zgartiriladigan satrlar bilan ishlashda
Ushbu mavzuni JavaRush kursida Java Multithreading kvestining ikkinchi darajasida batafsil o'rganishingiz mumkin:
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION