Hogyan tárolódnak a sztringek a memóriában Java-ban?
sobes.tech MI
Válasz az MI-től
Java-ban a String egy immutable (változtathatatlan) objektum. Az értéke egy karakterlánc sorozatával van reprezentálva.
Java 9-ig a String a karaktereket egy char[] tömbben tárolta. Minden karakter 2 bájt (UTF-16) helyet foglalt.
// Java 9-ig
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // A karakterlánc karakterei
private final int offset; // Kezdő eltolás
private final int count; // Karakterek száma (hossz)
// ... más mezők és metódusok
}
Java 9-től kezdődően, a memória takarékossága érdekében, a String vagy byte[] tömböt (ASCII/Latin-1 karakterekhez), vagy char[] tömböt használhat. A kódolást a coder zászló határozza meg.
// Java 9-től
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // A karakterlánc karakterei (byte[] vagy char[] lényegében, a coder-től függően)
private final byte coder; // Kódolás: 0 Latin-1-hez, 1 UTF-16-hoz
// ... más mezők és metódusok
}
A string literálok (megengedett karakterek) és a new String(...) segítségével létrehozott stringek a "heap"-en tárolódnak.
A string literálok továbbá a "String Pool"-ban helyezkednek el, amely a PermGen memória területen (Java 8 előtt) vagy a MetaSpace-ben (Java 8-tól) található. Ha egy ilyen értékű string már létezik a pool-ban, akkor a meglévő objektumra mutató hivatkozást használják.
String s1 = "hello"; // Létrehozza a "hello"-t a String Pool-ban (ha még nem létezik), s1 erre mutat
String s2 = "hello"; // s2 ugyanarra az objektumra mutat, mint s1
String s3 = new String("hello"); // Új "hello" objektumot hoz létre a heap-en, s3 erre mutat. "hello" lehet a String Pool-ban
Mivel a stringek immutable-ek, a string értékének módosítása (pl. összefűzés) új String objektum létrehozásához vezet a memóriában.