Sobes.tech
Middle

Java tilida satrlar qanday xotirada saqlanadi?

sobes.tech AI

AIdan javob

Java'da, satr (String) o'zgarmas ob'ekt hisoblanadi. Uning qiymati belgilar ketma-ketligi bilan ifodalanadi.

Java 9 gacha, String belgilarni char[] massivida saqlardi. Har bir belgi 2 bayt (UTF-16) egallardi.

// Java 9 gacha
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Satrdagi belgilar
    private final int offset;   // Boshlang'ich ofset
    private final int count;    // Belgilar soni (uzunligi)
    // ... boshqa maydonlar va metodlar
}

Java 9 bilan, xotira tejash uchun, String yoki byte[] massivini (ASCII/Latin-1 belgilar uchun) yoki char[] massivini ishlatishi mumkin. Kodlash coder bayrog'i bilan aniqlanadi.

// Java 9 dan boshlab
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Satrdagi belgilar (byte[] yoki char[] asosan, coder'ga bog'liq)
    private final byte coder;   // Kodlash: 0 Latin-1 uchun, 1 UTF-16 uchun
    // ... boshqa maydonlar va metodlar
}

Satir literal'lari (ruxsat etilgan belgilar) va new String(...) yordamida yaratilgan satrlar "xotira"da saqlanadi.

Satir literal'lari shuningdek, PermGen (Java 8 dan oldin) yoki MetaSpace (Java 8 va undan keyin) bo'limida joylashgan "String Pool" (Satrlar havzasi) ga joylashtiriladi. Agar bunday qiymatga ega satr havuzda allaqachon mavjud bo'lsa, mavjud ob'ektga havola ishlatiladi.

String s1 = "hello"; // "hello" ni String Pool'da yaratadi (agar mavjud bo'lmasa), s1 unga murojaat qiladi
String s2 = "hello"; // s2, aynan shu "hello" ob'ektiga murojaat qiladi
String s3 = new String("hello"); // Yangi "hello" ob'ektini xotirada yaratadi, s3 unga murojaat qiladi. "hello" havuzda bo'lishi mumkin

Satrlari o'zgarmas bo'lgani uchun, satr qiymatini o'zgartirish (masalan, qo'shish) yangi String ob'ektini xotirada yaratishga olib keladi.