Синфи сатр
Ин синф пайдарпаии аломатҳоро ифода мекунад. Ҳама адабии сатри дар барномаҳо муайяншуда, ба монанди "Ин сатр аст" мисолҳои синфи String мебошанд. Сатр ду хусусияти асосӣ дорад:- ин синфи тағйирнопазир аст
- ин синфи ниҳоӣ аст
final
) ва мисолҳои синфро пас аз эҷод ( immutable
) тағир додан мумкин нест. Ин ба синфи String якчанд бартариҳои муҳим медиҳад:
-
Аз сабаби тағирнопазирӣ, хэшcodeи намунаи синфи String кэш карда мешавад. Онро ҳар дафъа арзёбӣ кардан лозим нест, зеро арзишҳои майдони an object пас аз сохтани он ҳеҷ гоҳ тағир намеёбанд. Ин ҳангоми истифодаи ин синф ҳамчун калид барои
HashMap
. -
Синфи String метавонад дар муҳити чанд ришта бидуни ҳамоҳангсозии иловагӣ истифода шавад.
-
Хусусияти дигари синфи String ин аст, ки он
+
оператори " "ро дар Java аз ҳад зиёд бор мекунад. Аз ин рӯ, пайвастан (илова кардан) сатрҳо хеле содда аст:
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
ва аз ҷониби ҳамаи синфҳои дигар мерос гирифташуда ба намоиши сатр андохтан мумкин аст. Аксар вақт усули toString() дар an object ба таври ғайримустақим номида мешавад. Масалан, вақте ки мо чизеро дар экран нишон медиҳем ё ба an objectи синфи дигар String илова мекунем. Синфи String боз як хусусият дорад. Ҳамаи адабии сатри дар codeи Java муайяншуда, ба монанди "asdf", дар вақти тартибдиҳӣ кэш карда мешаванд ва ба ҳавзи ба истилоҳ сатр илова карда мешаванд. Агар мо рамзи зеринро иҷро кунем:
String a = "Wake up, Neo";
String b = "Wake up, Neo";
System.out.println(a == b);
Мо ҳақиқиро дар консол хоҳем дид , зеро тағирёбандаҳо a
воқеан b
ба ҳамон мисоли синфи String, ки дар вақти компиляция ба ҳавзи сатр илова шуда буданд, ишора мекунанд. Яъне мисолҳои гуногуни синф бо арзиши якхела сохта намешаванд ва хотира захира карда мешавад.
Камбудиҳо:
Тахмин кардан душвор нест, ки синфи String асосан барои кор бо сатр лозим аст. Аммо дар баъзе мавридҳо, хусусиятҳои дар боло зикршудаи синфи String метавонанд аз афзалиятҳо ба камбудиҳо табдил ёбанд. Вақте ки сатрҳо дар codeи Java сохта мешаванд, аксар вақт дар онҳо амалҳои зиёде иҷро карда мешаванд:- табдил додани сатрҳо ба регистрҳои гуногун;
- истихроҷи зерсатр;
- пайвастшавӣ;
- ва гайра.
public static void main(String[] args) {
String s = " Wake up, Neo! ";
s = s.toUpperCase();
s = s.trim();
System.out.println("\"" + s + "\"");
}
Дар назари аввал, чунин менамояд, ки мо наваHow сатри «Бедор шав, Нео!»-ро тарчума кардаем. ба ҳарфҳои калон, фосилаҳои иловагӣ аз ин сатр хориҷ карда, онро дар нохунак печонд. Дарвоқеъ, аз сабаби тағирнопазирии синфи String, дар натиҷаи ҳар як амал, мисолҳои сатри нав сохта мешаванд ва кӯҳнаҳо партофта мешаванд, ки миқдори зиёди партовҳоро тавлид мекунанд. Чӣ тавр аз талафоти хотира пешгирӣ кардан мумкин аст?
Синфи StringBuffer
Барои коркарди эҷоди партовҳои муваққатӣ бо сабаби тағир додани an objectи String, шумо метавонед синфи StringBuffer -ро истифода баред. Инmutable
синф аст, яъне. тағйирёбанда. Объекти синфи StringBuffer метавонад маҷмӯи мушаххаси аломатҳоро дар бар гирад, ки дарозӣ ва арзиши онҳоро тавассути даъват кардани усулҳои муайян тағир додан мумкин аст. Биёед бубинем, ки ин синф чӣ гуна кор мекунад. Барои сохтани an objectи нав яке аз конструкторҳои онро истифода баред, масалан:
- StringBuffer() - an objectи холӣ (бе аломат) эҷод мекунад
- StringBuffer(String str) - an objectро дар асоси тағирёбандаи str эҷод мекунад (ҳамаи аломатҳои str дар як пайдарпаӣ дорад)
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Пайвасткунии сатр тавассути StringBuffer дар Java бо истифода аз append
. Умуман, усул append
дар синфи StringBuffer тавре пурбор карда шудааст, ки он метавонад қариб ҳама намуди маълумотро қабул кунад:
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
мавқеъ иваз мекунадend
str
reverse()
— тартиби хамаи аломатхоро иваз мекунадsubstring(int start, int end)
start
- зерсатри аз мавқеъ ба мавқеъ саршударо бармегардонадend
substring(int start)
- зерсатри аз мавқеъ оғозшударо бармегардонад
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
}
Афзалиятҳо:
-
Тавре ки аллакай зикр гардид, StringBuffer синфи тағйирёбанда аст, аз ин рӯ кор бо он миқдори партовҳои хотираро ба мисли String эҷод намекунад. Аз ин рӯ, агар ба сатрҳо тағироти зиёде ворид карда шаванд, беҳтар аст, ки
StringBuffer
. -
StringBuffer синфи риштаи бехатар аст. Усулҳои он ҳамоҳанг карда мешаванд ва мисолҳо метавонанд аз ҷониби якчанд риштаҳо дар як вақт истифода шаванд.
Камбудиҳо:
Аз як тараф, бехатарии ришта бартарии синф аст, ва аз тарафи дигар, ин камбудӣ аст. Усулҳои ҳамоҳангшуда нисбат ба усулҳои ҳамоҳангшуда сусттаранд. Дар ин ҷо StringBuilder бозӣ мекунад. Биёед бифаҳмем, ки он чӣ гуна синфи Java аст - StringBuilder, он чӣ гуна усулҳо дорад ва хусусиятҳои он чист.Синфи StringBuilder
StringBuilder дар Java синфест, ки пайдарпаии аломатҳоро ифода мекунад. Он аз ҳама ҷиҳат ба StringBuffer хеле монанд аст, ба истиснои бехатарии ришта. StringBuilder API-и шабеҳи StringBufferро таъмин мекунад. Биёед инро бо истифода аз як мисоли шинос нишон диҳем ва иваз кардани эъломияи тағирёбандаҳоро аз 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 нест. Ин ягона хусусият аст. StringBuilder дар Java аз сабаби синхронизатсия нашудани усулҳо нисбат ба StringBuffer тезтар аст. Аз ин рӯ, дар аксари мавридҳо, ба истиснои муҳити чанд ришта, беҳтар аст, ки StringBuilder барои барномаи Java истифода шавад. Мо ҳама чизро дар ҷадвали муқоисавии се синф ҷамъбаст мекунем:
String vs StringBuffer vs StringBuilder
Сатр | StringBuffer | StringBuilder | |
---|---|---|---|
Тағйирпазирӣ | Immutable (Не) |
mutable (ҳа) |
mutable (ҳа) |
Васеъшавӣ | final (Не) |
final (Не) |
final (Не) |
Бехатарии ришта | Бале, аз сабаби тағйирнопазирӣ | Бале, аз сабаби синхронизатсия | Не |
Кай истифода бурдан | Ҳангоми кор бо сатрҳо, ки хеле кам тағир дода мешаванд | Ҳангоми кор бо сатрҳое, ки дар муҳити бисёрсоҳавӣ зуд-зуд тағир дода мешаванд | Ҳангоми кор бо сатрҳое, ки зуд-зуд дар муҳити як ришта тағир дода мешаванд |
GO TO FULL VERSION