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
final
) bo'lishi mumkin emas va yaratilgandan so'ng sinf misollarini o'zgartirib bo'lmaydi ( immutable
). Bu String sinfiga bir qancha muhim afzalliklarni beradi:
-
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
. -
String sinfidan qo'shimcha sinxronizatsiyasiz ko'p tarmoqli muhitda foydalanish mumkin.
-
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 Object
va 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 a
aslida b
kompilyatsiya 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.
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. Bumutable
sinf, 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)
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Java'da StringBuffer orqali satrlarni birlashtirish append
. Umuman olganda, StringBuffer sinfidagi usul append
deyarli 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 append
o'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'yadioffset
. Usulinsert
ham haddan tashqari yuklangan va turli argumentlarni qabul qilishi mumkinreplace(int start, int end, String str)
- barcha belgilarni pozitsiyadanstart
pozitsiyaga almashtiradiend
str
reverse()
— barcha belgilar tartibini o'zgartiradisubstring(int start, int end)
start
- pozitsiyadan pozitsiyaga boshlanadigan pastki qatorni qaytaradiend
substring(int start)
- pozitsiyadan boshlanadigan pastki qatorni qaytaradi
start
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:
-
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
. -
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 |
GO TO FULL VERSION