Loading...

StringBuffer жана StringBuilder

 

Сап объекттери өзгөрүлгүс, ошондуктан саптарды өзгөрткөн бардык операциялар чындыгында жаңы сапты түзүүгө алып келет, бул колдонмонун иштешине таасир этет. Бул көйгөйдү чечүү үчүн, азыраак чыгымы бар саптар менен иштөө үчүн Javaга StringBuffer жана StringBuilder класстары кошулган. Чындыгында, алар аткарууну бузбастан өзгөртсө боло турган кеңейтилүүчү сапка окшош.

Бул класстар окшош, дээрлик эгиз, алардын конструкторлору, методдору бирдей, алар бирдей колдонулат. Бир гана айырмасы, StringBuffer классы синхрондоштурулган жана жип коопсуз. Башкача айтканда, StringBuffer классы көп жиптүү тиркемелерде колдонууга ыңгайлуу, мында бул класстын объектиси ар кандай жиптерде өзгөрүшү мүмкүн. Эгерде биз көп жиптүү тиркемелер жөнүндө сөз кылбасак, анда StringBuilder классын колдонуу жакшы, ал жип үчүн коопсуз эмес, бирок StringBufferге караганда бир жиптүү тиркемелерде ылдамыраак.

 

StringBuffer төрт конструкторду аныктайт:

StringBuffer()

StringBuffer(int capacity)

StringBuffer(String str)

StringBuffer(CharSequence chars)

Окшош конструкторлор StringBuilder тарабынан аныкталат:

StringBuilder()

StringBuilder(int capacity)

StringBuilder(String str)

StringBuilder(CharSequence chars)

Мисал катары StringBuffer функциясын колдонуу менен бул класстардын ишин карап көрөлү.

 

Саптар менен бардык операциялар үчүн StringBuffer / StringBuilder бөлүнгөн эстутумду кайра бөлүштүрөт. Жана эстутумду тез-тез бөлүштүрбөө үчүн, StringBuffer/StringBuilder колдонула турган кээ бир эстутум аймагын алдын ала бөлүп берет. Параметрсиз конструктор эстутумда 16 символ үчүн мейкиндикти сактайт. Эгерде символдордун саны ар кандай болушун кааласак, анда символдордун санын параметр катары кабыл алган экинчи конструкторду колдонсок болот.

Эки класстын үчүнчү жана төртүнчү конструкторлору сапты жана символдор топтомун кабыл алышат, мында кошумча 16 символ үчүн эстутум сакталат.

 

Capacity() ыкмасын колдонуу менен биз эстутум сакталган символдордун санын ала алабыз. Жана символ буферинин минималдуу сыйымдуулугун өзгөртүү үчүн ensureCapacity() ыкмасын колдонуу:

String str = "Java";

StringBuffer strBuffer = new StringBuffer(str);

System.out.println("Емкость: " + strBuffer.capacity()); // 20

strBuffer.ensureCapacity(32);

System.out.println("Емкость: " + strBuffer.capacity()); // 42

System.out.println("Длина: " + strBuffer.length()); // 4

StringBuffer эң башында "Java" сабы менен инициализациялангандыктан, анын сыйымдуулугу 4 + 16 = 20 символду түзөт. Андан кийин strBuffer.ensureCapacity(32) деп чакырып, буфер сыйымдуулугун 32 белгиге чейин көбөйтөбүз. Бирок, акыркы кубаттуулугу жогору карай ар кандай болушу мүмкүн. Ошентип, бул учурда, мен 32 эмес, 32 + 4 = 36 эмес, 42 белгиге ээ болом. Чындыгында, эффективдүүлүктү жогорулатуу үчүн Java кошумча эстутумду бөлүштүрө алат.

Бирок кандай болгон күндө да, сыйымдуулугуна карабастан, StringBuffer ичиндеги length() ыкмасын колдонуу менен алынуучу саптын узундугу өзгөрүүсүз калат - 4 символ (себеби, "Javaда" 4 символ бар).

 

StringBufferде сакталган сапты алуу үчүн биз стандарттуу toString() ыкмасын колдонсок болот:

String str = "Java";

StringBuffer strBuffer = new StringBuffer(str);

System.out.println(strBuffer.toString()); // Java

Бардык операцияларында StringBuffer жана StringBuilder String классына окшош.

 

Символдорду алуу жана орнотуу

charAt() методу алат жана setCharAt() методу белгини көрсөтүлгөн индекске орнотот:

StringBuffer strBuffer = new StringBuffer("Java");

char c = strBuffer.charAt(0); // J

System.out.println(c);

strBuffer.setCharAt(0, 'c');

System.out.println(strBuffer.toString()); // cava

getChars() методу белгилүү бир индекстердин ортосундагы символдордун жыйындысын алат:

StringBuffer strBuffer = new StringBuffer("world");

int startIndex = 1;

int endIndex = 4;

char[] buffer = new char[endIndex-startIndex];

strBuffer.getChars(startIndex, endIndex, buffer, 0);

System.out.println(buffer); // orl

Сапка кошуу

append() методу StringBufferдин аягына субсапты кошот:

StringBuffer strBuffer = new StringBuffer("hello");

strBuffer.append(" world");

System.out.println(strBuffer.toString()); // hello world

insert() методу StringBufferге белгилүү бир индексте сапты же символду кошот:

StringBuffer strBuffer = new StringBuffer("word");

        

strBuffer.insert(3, 'l');

System.out.println(strBuffer.toString()); //world

 

strBuffer.insert(0, "s");

System.out.println(strBuffer.toString()); //sworld

Белгилер жок кылынууда

Delete() методу белгилүү бир позициядагы белгилүү бир индекстен бардык символдорду жок кылат, ал эми deleteCharAt() ыкмасы белгилүү бир индекстеги бир символду жок кылат:

StringBuffer strBuffer = new StringBuffer("assembler");

strBuffer.delete(0,2);

System.out.println(strBuffer.toString()); //sembler

        

strBuffer.deleteCharAt(6);

System.out.println(strBuffer.toString()); //semble

Жолчону кесүү

substring() ыкмасы сапты белгилүү бир индекстен аягына чейин же белгилүү бир индекске чейин кесип салат:

StringBuffer strBuffer = new StringBuffer("hello java!");

String str1 = strBuffer.substring(6); // обрезка строки с 6 символа до конца

System.out.println(str1); //java!

        

String str2 = strBuffer.substring(3, 9); // обрезка строки с 3 по 9 символ

System.out.println(str2); //lo jav

Узундугун өзгөртүү

setLength() методу StringBufferдин узундугун өзгөртүү үчүн колдонулат (символ буферинин сыйымдуулугу эмес). Эгерде StringBuffer көбөйсө, анда анын сапы жөн эле аягында бош символдор менен толтурулат, эгерде ал азайса, анда сап негизинен үзүлөт:

StringBuffer strBuffer = new StringBuffer("hello");

strBuffer.setLength(10);

System.out.println(strBuffer.toString()); //"hello     "

        

strBuffer.setLength(4);

System.out.println(strBuffer.toString()); //"hell"

Бир сапта алмаштыруу

StringBuffer ичиндеги белгилүү позициялардын ортосундагы субсапты башка подсапка алмаштыруу үчүн, replace() ыкмасын колдонуңуз:

StringBuffer strBuffer = new StringBuffer("hello world!");

strBuffer.replace(6,11,"java");

System.out.println(strBuffer.toString()); //hello java!

Алмаштыруу ыкмасынын биринчи параметри алмаштырууну кайсы позициядан баштоону, экинчи параметр - кайсы позицияга, ал эми үчүнчү параметр алмаштыруучу подсапты көрсөтөт.

 

Саптын тескери ирети

reverse() ыкмасы StringBufferдеги тартипти тескери кылат:

StringBuffer strBuffer = new StringBuffer("assembler");

strBuffer.reverse();

System.out.println(strBuffer.toString()); //relbmessa