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), რომელიც მდებარეობს 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 ობიექტის შექმნას მეხსიერებაში.