Page 1 of 1

Java και Strings

Posted: Sat Dec 22, 2007 1:46 pm
by Theofaman
Έχουμε τον εξής κώδικα

Code: Select all

        String s1= "Hello";
        String s2= "Hello";
        String s3= new String("Hello");
        if(s1==s2)System.out.println("ISA");
        else System.out.println("ANISA");
        if(s1==s3)System.out.println("ISA");
        else System.out.println("ANISA");
Προφανώς το 1ο if θα τυπώσει "ISA" και το 2ο "ANISA".
Ψάχνοντας να δω ακριβώς γιατί γίνεται αυτό, άρχισα παίζω με τον Debugger του NetBeans και εκεί είναι που χρειάζομαι μια μικρή βοήθεια... :-)
Έχω επισυνάψει 2 εικόνες οι οποίες προκύπτουν με την επιλογή ''show references'' για τις s1,s2,s3. Οι s1 και s2 έχουν τα ίδια ακριβώς στοιχεία οπότε έβαλα ένα screenshot. Μπορεί κάποιος να μου εξηγήσει τι αντιπροσωπεύουν αυτά που βρίσκονται μέσα σε κόκκινο κύκλο στις φωτογραφίες? Ευχαριστώ :)

Re: Java και Strings

Posted: Sat Dec 22, 2007 7:52 pm
by HdkiLLeR
Κοίταξε να δεις η 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. Γι' αυτό και να νούμερα που παρατηρείς.

Re: Java και Strings

Posted: Sat Dec 22, 2007 9:08 pm
by Theofaman
Ευχαριστώ :)