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.