როგორ ინახება სტრიქონები მეხსიერებაში 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), რომელიც მდებარეობს PermGen-ის (Java 8-მდე) ან MetaSpace-ის (Java 8-დან და შემდეგ) მეხსიერების ზონაში. თუ ასეთი მნიშვნელობის სტრიქონი უკვე არსებობს პულში, გამოიყენება არსებული ობიექტის ბმული.
String s1 = "hello"; // ქმნის "hello"-ს String Pool-ში (თუ ჯერ არ არსებობს), s1 მასზე მიუთითებს
String s2 = "hello"; // s2 მიუთითებს იმავე "hello" ობიექტზე String Pool-ში
String s3 = new String("hello"); // ქმნის ახალ "hello" ობიექტს ჰიპში, s3 მასზე მიუთითებს. "hello" შეიძლება იყოს String Pool-ში
რადგან სტრიქონები შეუცვლელები არიან, მათი მნიშვნელობის შეცვლა (მაგალითად, კონკატენაცია) იწვევს ახალი String ობიექტის შექმნას მეხსიერებაში.