Жол сыныбы
Бұл класс таңбалар тізбегін білдіреді. «Бұл жол» сияқты бағдарламаларда анықталған барлық жол литералдары String сыныбының даналары болып табылады. Жолдың екі негізгі қасиеті бар:- бұл өзгермейтін класс
- бұл соңғы сынып
final
) болуы мүмкін емес және класс даналары жасалғаннан кейін өзгертілмейді ( immutable
). Бұл String класына бірнеше маңызды артықшылықтар береді:
-
Өзгермейтіндіктен String класының данасы хэшcodeы кэштеледі. Оны әр уақытта бағалаудың қажеті жоқ, себебі нысанның өріс мәндері ол жасалғаннан кейін ешқашан өзгермейді. Бұл класс үшін кілт ретінде пайдаланған кезде жоғары өнімділік береді
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 сыныбының тағы бір қызықты қасиеті: кез келген сыныптың нысандарын toString()
сыныпта анықталған әдісті пайдаланып жол көрінісіне шығаруға болады Object
және барлық басқа сыныптар мұраға алады. Көбінесе нысандағы toString() әдісі жасырын түрде шақырылады. Мысалы, экранда бірдеңені көрсеткенде немесе басқа сыныптың an objectісіне Жолды қосқанда. String класының тағы бір мүмкіндігі бар. "asdf" сияқты Java codeында анықталған барлық жол литералдары компиляция уақытында кэштеледі және жол пулы деп аталатынға қосылады. Келесі codeты іске қосатын болсақ:
String a = "Wake up, Neo";
String b = "Wake up, Neo";
System.out.println(a == b);
Біз консольде true көреміз , себебі айнымалы мәндер компиляция уақытында жол пулына қосылған String сыныбының бірдей данасына сілтеме жасайды a
. b
Яғни, бірдей мәнге ие класстың әртүрлі даналары жасалмайды, жады сақталады.
Кемшіліктері:
String класы ең алдымен жолдармен жұмыс істеу үшін қажет екенін болжау қиын емес. Бірақ кейбір жағдайларда String класының жоғарыдағы мүмкіндіктері артықшылықтардан кемшіліктерге айналуы мүмкін. Java codeында жолдар жасалғаннан кейін олармен жиі көптеген операциялар орындалады:- жолдарды әртүрлі регистрлерге түрлендіру;
- ішкі жолды шығару;
- жалғау;
- және т.б.
public static void main(String[] args) {
String s = " Wake up, Neo! ";
s = s.toUpperCase();
s = s.trim();
System.out.println("\"" + s + "\"");
}
Бір қарағанда «Оян, Нео!» деген жолды жаңа ғана аударған сияқтымыз. бас әріптерге, осы жолдан қосымша бос орындарды алып тастап, оны тырнақшаға ораңыз. Шын мәнінде, String класының өзгермейтіндігіне байланысты, әрбір операцияның нәтижесінде жаңа жол даналары жасалады және ескілері жойылып, үлкен көлемдегі қоқыс тудырады. Жадты ысырап етуді қалай болдырмауға болады?
StringBuffer сыныбы
String нысанындағы өзгертулерге байланысты уақытша қоқысты жасауды өңдеу үшін StringBuffer сыныбын пайдалануға болады. Бұлmutable
сынып, яғни. өзгермелі. StringBuffer класының an objectісі белгілі бір әдістерді шақыру арқылы ұзындығы мен мәнін өзгертуге болатын белгілі бір символдар жиынын қамтуы мүмкін. Бұл сынып қалай жұмыс істейтінін көрейік. Жаңа нысан жасау үшін оның конструкторларының бірін пайдаланыңыз, мысалы:
- StringBuffer() - бос (таңбасыз) нысан жасайды
- StringBuffer(String str) - str айнымалысы негізінде нысан жасайды (бір реттіліктегі str барлық таңбаларын қамтитын)
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Java тіліндегі StringBuffer арқылы жолды біріктіру 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
өзі шақырылған нысанды қайтарады (көптеген басқа әдістер сияқты), бұл оны «тізбекте» шақыруға мүмкіндік береді. Жоғарыдағы мысалды былай жазуға болады:
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 сыныбы
Java тіліндегі StringBuilder - бұл таңбалар тізбегін көрсететін класс. Ол жіп қауіпсіздігінен басқа барлық жағынан StringBuffer-ге өте ұқсас. StringBuilder StringBuffer сияқты API ұсынады. Мұны бұрыннан таныс мысалды пайдаланып, айнымалылар декларациясын 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 жоқ. Бұл жалғыз қасиет. Java тіліндегі StringBuilder әдістері синхрондалмағандықтан StringBuffer-ге қарағанда жылдамырақ. Сондықтан көп ағынды ортаны қоспағанда, көп жағдайда Java бағдарламасы үшін StringBuilder қолданған дұрыс. Біз барлығын үш сыныптың салыстырмалы кестесінде қорытындылаймыз:
String және StringBuffer және StringBuilder
Жол | StringBuffer | StringBuilder | |
---|---|---|---|
Өзгергіштік | Immutable (Жоқ) |
mutable (Иә) |
mutable (Иә) |
Кеңейтімділік | final (Жоқ) |
final (Жоқ) |
final (Жоқ) |
Жіп қауіпсіздігі | Иә, өзгермейтіндіктен | Иә, синхрондау арқасында | Жоқ |
Қашан пайдалану керек | Сирек өзгертілетін жолдармен жұмыс істегенде | Көп ағынды ортада жиі өзгертілетін жолдармен жұмыс істегенде | Бір ағынды ортада жиі өзгертілетін жолдармен жұмыс істегенде |
GO TO FULL VERSION