Чӣ тавр сатрҳо дар хотира дар 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[] истифода кунад. Кодировка бо рамзи 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" нигоҳ дошта мешаванд.
Литсензияҳои сатрӣ инчунин дар "Pool of Strings" (пул сатрҳо) ҷойгир мешаванд, ки дар минтақаи хотира PermGen (пеш аз Java 8) ё MetaSpace (аз Java 8 ба баъд) ҷойгир аст. Агар сатр бо ҳамин арзиш аллакай дар пул мавҷуд бошад, ба объекте, ки аллакай вуҷуд дорад, ишора мекунад.
String s1 = "hello"; // "hello"-ро дар Pool of Strings (агар пештар набошад) месозад, s1 ба он ишора мекунад
String s2 = "hello"; // s2 ба ҳамон объект "hello" дар Pool of Strings ишора мекунад
String s3 = new String("hello"); // Яке навъи "hello" дар heap месозад, s3 ба он ишора мекунад. "hello" метавонад дар Pool of Strings бошад
Азбаски сатрҳо беиғозишавӣ мебошанд, тағир додани арзиши сатр (масалан, пайваст кардан) ба сохтани объект нав String дар хотира оварда мерасонад.