Стринг классы
Бул класс символдордун ырааттуулугун билдирет. Программаларда аныкталган бардык сап литералдары, мисалы, "Бул сап" String классынын мисалдары. String эки негизги өзгөчөлүктөргө ээ:- бул өзгөрүлгүс класс
- бул акыркы класс
final
) болушу мүмкүн эмес жана класстын инстанциялары түзүлгөндөн кийин өзгөртүлбөйт ( immutable
). Бул String классына бир нече маанилүү артыкчылыктарды берет:
-
Өзгербестиктен улам, String классынын хэшcodeу кэштелет. Аны ар дайым баалоонун кереги жок, анткени an objectтин талаа маанилери ал түзүлгөндөн кийин эч качан өзгөрбөйт. Бул классты ачкыч катары колдонууда жогорку өндүрүмдүүлүктү берет
HashMap
. -
String классын кошумча синхрондоштуруусуз көп жиптүү чөйрөдө колдонсо болот.
-
String классынын дагы бир өзгөчөлүгү - ал
+
Java тorндеги " " операторун ашыкча жүктөйт. Демек, саптарды бириктирүү (кошуу) абдан жөнөкөй:
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
жана башка бардык класстар тарабынан мурасталган ыкманы колдонуу менен сап көрсөтүүгө чыгарылышы мүмкүн. Көбүнчө an objectтеги toString() ыкмасы кыйыр түрдө чакырылат. Мисалы, биз экранда бир нерсени көрсөткөндө же башка класстын an objectисине Сапты кошкондо. String классынын дагы бир өзгөчөлүгү бар. Java codeунда аныкталган бардык сап литералдары, мисалы, "asdf" компиляция убагында кэштелет жана саптык бассейн деп аталганга кошулат. Эгерде биз төмөнкү codeду иштетсек:
String a = "Wake up, Neo";
String b = "Wake up, Neo";
System.out.println(a == b);
Биз консолдо чындыкты көрөбүз , анткени өзгөрмөлөр a
чындыгында b
компиляция убагында сап пулуна кошулган String классынын эле инстанциясына кайрылышат. Башкача айтканда, бирдей мааниге ээ класстын ар кандай инстанциялары түзүлбөйт жана эстутум сакталат.
Кемчorктери:
String классы биринчи кезекте саптар менен иштөө үчүн керек экенин божомолдоо кыйын эмес. Бирок кээ бир учурларда, String классынын жогорудагы өзгөчөлүктөрү артыкчылыктардан кемчorктерге айланышы мүмкүн. 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 an objectине өзгөртүүлөрдү киргизүүдөн улам убактылуу таштандыларды түзүүнү башкаруу үчүн, сиз StringBuffer классын колдонсоңуз болот. Булmutable
класс, б.а. өзгөрмөлүү. StringBuffer классынын an objectи белгилердин белгилүү бир топтомун камтышы мүмкүн, алардын узундугун жана маанисин белгилүү ыкмаларды чакыруу менен өзгөртүүгө болот. Келгиле, бул класс кантип иштээрин карап көрөлү. Жаңы an object түзүү үчүн анын конструкторлорунун бирин колдонуңуз, мисалы:
- StringBuffer() - бош (белгисиз) an objectти түзөт
- StringBuffer(String str) - str өзгөрмөнүн негизинде an object түзөт (бир эле ырааттуулукта str бардык символдорун камтыган)
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = new StringBuffer("Not empty");
Javaдагы StringBuffer аркылуу сапты бириктирүү append
. Жалпысынан алганда, StringBuffer классындагы ыкма append
дээрлик бардык маалымат түрүн кабыл ала тургандай ашыкча жүктөлгөн:
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 жип коопсуз класс болуп саналат. Анын ыкмалары синхрондоштурулган жана инстанциялар бир эле учурда бир нече жиптер тарабынан колдонулушу мүмкүн.
Кемчorктери:
Бир жагынан жиптин коопсуздугу класстын артыкчылыгы болсо, экинчи жагынан бул кемчorк. Синхрондоштурулган ыкмалар синхрондоштурулган эмес методдорго караганда жайыраак. Бул жерде StringBuilder иштей баштайт. Келгиле, бул кандай Java классы экенин аныктап көрөлү - StringBuilder, анын кандай ыкмалары бар жана анын кандай өзгөчөлүктөрү бар.StringBuilder классы
Java тorндеги 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ди колдонуу жакшы. Биз үч класстын салыштырма tableсында баарын жалпылайбыз:
String vs StringBuffer vs StringBuilder
String | StringBuffer | StringBuilder | |
---|---|---|---|
Өзгөртүү | Immutable (Жок) |
mutable (Ооба) |
mutable (Ооба) |
Кеңейтүү | final (Жок) |
final (Жок) |
final (Жок) |
Жиптин коопсуздугу | Ооба, өзгөрүлбөстөн улам | Ооба, синхрондоштуруудан улам | Жок |
Качан колдонуу керек | сейрек өзгөртүлө турган саптар менен иштөөдө | Көп жиптүү чөйрөдө тез-тез өзгөртүлүп турган саптар менен иштөөдө | Бир жиптүү чөйрөдө тез-тез өзгөртүлүп турган саптар менен иштөөдө |
GO TO FULL VERSION