Κοίταξε να δεις η class String παρέχει objects τα οποία είναι
immutable. Immutable είναι ένα object όταν δεν επιδέχεται μεταποίηση. Το
String εάν το δημιουργήσεις δεν μπορείς να το πειράξεις. Γι' αυτόν τον λόγο υπάρχει η StringBuffer όπου μπορείς να κάνεις αλλαγές στις συμβολοσειρές σου (δηλαδή εάν έχεις το
Hello μπορείς να αλλάξεις το e σε a και να έχεις το
Hallo). Η
String κάθε φορά που πας να κάνεις κάτι τέτοιο απλά θα σου επιστρέψει ένα new object αλλά το πρώτο δεν θα έχει αλλάξει καθόλου.
Τώρα γιατί γίνονται όλα αυτά; Για
καλύτερο memory management. Η JVM κρατάει ένα pool με όλα τα Strings που έχεις δημιουργήσει και όποια είναι ίδια δεν εκχωρεί επιπλέον χώρο απλά βάζει τα references να δείχνουν στην ίδια θέση. Συνεπώς όταν κάνεις:
Code: Select all
String s1= "Hello";
String s2= "Hello";
String s3= new String("Hello");
Αρχικά δημιουργείς το reference
s1 που δείχνει στο string
Hello. Στην συνέχεια με βάση τα παραπάνω το s2 θα δείξει στο ίδιο σημείο. Συνεπώς το περιεχόμενο των μεταβλητών s1 και s2 (το οποίο είναι ένα memory address) είναι το ίδιο γι' αυτό και το πρώτο if τυπώνει
ISA. Στην συνέχεια κάνεις
s3 = new String(), αυτό σημαίνει ότι φτιάχνεις ένα νέο String, εκχωρείς χώρο απο το heap, γι' αυτό και το περιεχόμενο της s3 είναι μια νέα θέση μνήμης σε αντίθεση με τις s1, s2 που δείχνουν στην ίδια θέση. Η νέα αυτή θέση όμως αντί να έχει μέσα ένα αντίγραφο του
Hello, δείχνει και αυτή με την σειρά της εκεί που βρίσκεται το Hello. Γι' αυτό και να νούμερα που παρατηρείς.