Sobes.tech
Junior

Τι είναι η ομάδα συμβολοσειρών στη Java;

sobes.tech AI

Απάντηση από AI

Η δεξαμενή συμβολοσειρών (String pool) είναι μια ειδική περιοχή μνήμης στη Java heap, όπου αποθηκεύονται οι λεκτικοί συμβολοσειρών και οι ενσωματωμένες (interned) συμβολοσειρές. Ο κύριος σκοπός της είναι η εξοικονόμηση μνήμης μέσω της επανάχρησης των ίδιων τιμών συμβολοσειρών.

Πώς λειτουργεί:

Όταν δημιουργείται ένας λεκτικός συμβολοσειράς (π.χ., "γεια"), η JVM ελέγχει πρώτα αν υπάρχει ήδη μια συμβολοσειρά με αυτήν την τιμή στη δεξαμενή.

  • Αν η συμβολοσειρά υπάρχει: Η JVM επιστρέφει μια αναφορά στο ήδη υπάρχον αντικείμενο στη δεξαμενή, αντί να δημιουργήσει ένα νέο.
  • Αν η συμβολοσειρά δεν υπάρχει: Η JVM δημιουργεί ένα νέο αντικείμενο String στη δεξαμενή και επιστρέφει μια αναφορά σε αυτό.

Δημιουργία συμβολοσειρών και δεξαμενή:

  1. Χρησιμοποιώντας έναν λεκτικό συμβολοσειράς:
    // "γεια" είναι ένας λεκτικός συμβολοσειράς
    String s1 = "γεια";
    String s2 = "γεια";
    // s1 και s2 αναφέρονται στο ίδιο αντικείμενο στη δεξαμενή
    
  2. Με τον κατασκευαστή new String():
    String s3 = new String("κόσμος");
    String s4 = new String("κόσμος");
    // s3 και s4 αναφέρονται σε διαφορετικά αντικείμενα στη μνήμη, παρόλο που έχουν την ίδια τιμή.
    // Ο λεκτικός συμβολοσειράς "κόσμος" μπορεί να βρίσκεται στη δεξαμενή, αλλά τα αντικείμενα s3 και s4 βρίσκονται έξω από αυτή.
    
  3. Με τη μέθοδο intern():
    String s5 = new String("java");
    // Η μέθοδος intern() ελέγχει αν υπάρχει ήδη μια συμβολοσειρά με αυτήν την τιμή στη δεξαμενή
    String s6 = s5.intern();
    // Αν υπάρχει, επιστρέφει την αναφορά στο αντικείμενο στη δεξαμενή.
    // Αν όχι, προσθέτει την τρέχουσα συμβολοσειρά στη δεξαμενή και επιστρέφει την αναφορά σε αυτή.
    

Πλεονεκτήματα της δεξαμενής συμβολοσειρών:

  • Εξοικονόμηση μνήμης: Μειώνει τον αριθμό των διπλότυπων αντικειμένων συμβολοσειρών.
  • Βελτίωση απόδοσης: Η σύγκριση λεκτικών συμβολοσειρών (==) μπορεί να είναι ταχύτερη από τη σύγκριση αντικειμένων String με equals(), αν και οι δύο αναφορές δείχνουν στο ίδιο αντικείμενο στη δεξαμενή.

Σημαντική σημείωση:

Η σύγκριση συμβολοσειρών με τον τελεστή == ελέγχει αν δύο μεταβλητές αναφέρονται στο ίδιο αντικείμενο στη μνήμη. Για σύγκριση περιεχομένου συμβολοσειρών, πάντα χρησιμοποιείτε τη μέθοδο equals().

String str1 = "abc"; // Στη δεξαμενή
String str2 = "abc"; // Στη δεξαμενή, η ίδια αναφορά
String str3 = new String("abc"); // Εκτός δεξαμενής
String str4 = str3.intern(); // Στη δεξαμενή, η ίδια αναφορά με str1 και str2

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true