Sobes.tech
Middle

Java тилинде саптар кантип сакталат?

sobes.tech AI

AIден жооп

Javaда жол (String) өзгөрүлгүс эмес объект болуп саналат. Анын мааниси символдордун тизмеги түрүндө көрсөтүлгөн.

Java 9га чейин, String символдорду char[] массивинде сактаган. Ар бир символ 2 байтты (UTF-16) ээлеген.

// Java 9га чейин
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Жолдун символдору
    private final int offset;   // Баштапкы жылыш
    private final int count;    // Символдордун саны (узундук)
    // ... башка талаалар жана методдор
}

Java 9дан кийин, эс тутумду үнөмдөө үчүн, String же byte[] массивин (ASCII/Latin-1 символдору үчүн), же char[] массивин (UTF-16 символдору үчүн) колдонуп сактай алат. Коддоо түрүн аныктоо үчүн coder белгиси колдонулат.

// Java 9дан кийин
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Жолдун символдору (byte[] же char[] негизинде, coderге жараша)
    private final byte coder;   // Коддоо: 0 Latin-1 үчүн, 1 UTF-16 үчүн
    // ... башка талаалар жана методдор
}

Жолдук литерлер (жана new String(...) оператору аркылуу түзүлгөн жолдор) "кучада" (heap) сакталат.

Жолдук литерлер ошондой эле String Pool деп аталган жадвалга жайгаштырылат, ал Java 8ге чейин PermGen аймагында, Java 8ден кийин MetaSpaceте жайгашкан. Эгерде андай мааниге ээ жол пулда болсо, анда ошол объектке шилтеме колдонулат.

String s1 = "hello"; // "hello" String Poolда түзүлөт (эгер жок болсо), s1 ага шилтеме кылат
String s2 = "hello"; // s2 ошол эле "hello" объектине шилтеме кылат
String s3 = new String("hello"); // Жаңы "hello" объектин кучада түзөт, s3 ага шилтеме кылат. "hello" String Poolда болушу мүмкүн

Жолдар өзгөрүлгүс болгондуктан, алардын маанисин өзгөртүү (мисалы, кошуу) жаңы String объектисин түзүүгө алып келет.