Τι είναι η ομάδα συμβολοσειρών στη Java;
sobes.tech AI
Απάντηση από AI
Η δεξαμενή συμβολοσειρών (String pool) είναι μια ειδική περιοχή μνήμης στη Java heap, όπου αποθηκεύονται οι λεκτικοί συμβολοσειρών και οι ενσωματωμένες (interned) συμβολοσειρές. Ο κύριος σκοπός της είναι η εξοικονόμηση μνήμης μέσω της επανάχρησης των ίδιων τιμών συμβολοσειρών.
Πώς λειτουργεί:
Όταν δημιουργείται ένας λεκτικός συμβολοσειράς (π.χ., "γεια"), η JVM ελέγχει πρώτα αν υπάρχει ήδη μια συμβολοσειρά με αυτήν την τιμή στη δεξαμενή.
- Αν η συμβολοσειρά υπάρχει: Η JVM επιστρέφει μια αναφορά στο ήδη υπάρχον αντικείμενο στη δεξαμενή, αντί να δημιουργήσει ένα νέο.
- Αν η συμβολοσειρά δεν υπάρχει: Η JVM δημιουργεί ένα νέο αντικείμενο
Stringστη δεξαμενή και επιστρέφει μια αναφορά σε αυτό.
Δημιουργία συμβολοσειρών και δεξαμενή:
- Χρησιμοποιώντας έναν λεκτικό συμβολοσειράς:
// "γεια" είναι ένας λεκτικός συμβολοσειράς String s1 = "γεια"; String s2 = "γεια"; // s1 και s2 αναφέρονται στο ίδιο αντικείμενο στη δεξαμενή - Με τον κατασκευαστή
new String():String s3 = new String("κόσμος"); String s4 = new String("κόσμος"); // s3 και s4 αναφέρονται σε διαφορετικά αντικείμενα στη μνήμη, παρόλο που έχουν την ίδια τιμή. // Ο λεκτικός συμβολοσειράς "κόσμος" μπορεί να βρίσκεται στη δεξαμενή, αλλά τα αντικείμενα s3 και s4 βρίσκονται έξω από αυτή. - Με τη μέθοδο
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