Πώς αποθηκεύονται οι συμβολοσειρές στη μνήμη στη Java;
sobes.tech AI
Απάντηση από AI
Στη Java, μια συμβολοσειρά (String) είναι ένα αμετάβλητο αντικείμενο. Η τιμή της αντιπροσωπεύεται από μια ακολουθία χαρακτήρων.
Μέχρι την Java 9, το String αποθήκευε τους χαρακτήρες σε έναν πίνακα char[]. Κάθε χαρακτήρας καταλάμβανε 2 bytes (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".
Οι λεκτικές συμβολοσειρές επίσης τοποθετούνται στο "String Pool", που βρίσκεται στην περιοχή μνήμης PermGen (πριν από την Java 8) ή MetaSpace (από την Java 8 και μετά). Αν μια συμβολοσειρά με την ίδια τιμή ήδη υπάρχει στο pool, χρησιμοποιείται μια αναφορά στο υπάρχον αντικείμενο.
String s1 = "hello"; // Δημιουργεί "hello" στο String Pool (αν δεν υπάρχει ήδη), το s1 αναφέρεται σε αυτό
String s2 = "hello"; // Το s2 αναφέρεται στο ίδιο αντικείμενο "hello" στο String Pool
String s3 = new String("hello"); // Δημιουργεί ένα νέο αντικείμενο "hello" στη heap, το s3 αναφέρεται σε αυτό. Το "hello" μπορεί να είναι στο String Pool
Επειδή οι συμβολοσειρές είναι αμετάβλητες, η αλλαγή της τιμής μιας συμβολοσειράς (π.χ. με συνημμένη) οδηγεί στη δημιουργία ενός νέου αντικειμένου String στη μνήμη.