Java και Strings

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Theofaman
Mbyte level
Mbyte level
Posts: 984
Joined: Sat Sep 24, 2005 1:07 am
Academic status: Alumnus/a
Gender:
Location: Running from the weak side to the low post

Java και Strings

Post by Theofaman » Sat Dec 22, 2007 1:46 pm

Έχουμε τον εξής κώδικα

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. Μπορεί κάποιος να μου εξηγήσει τι αντιπροσωπεύουν αυτά που βρίσκονται μέσα σε κόκκινο κύκλο στις φωτογραφίες? Ευχαριστώ :)
You do not have the required permissions to view the files attached to this post.
Theo(pame na)fam(e mprizoles)an!
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Re: Java και Strings

Post by HdkiLLeR » Sat Dec 22, 2007 7:52 pm

Κοίταξε να δεις η 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. Γι' αυτό και να νούμερα που παρατηρείς.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
Theofaman
Mbyte level
Mbyte level
Posts: 984
Joined: Sat Sep 24, 2005 1:07 am
Academic status: Alumnus/a
Gender:
Location: Running from the weak side to the low post

Re: Java και Strings

Post by Theofaman » Sat Dec 22, 2007 9:08 pm

Ευχαριστώ :)
Theo(pame na)fam(e mprizoles)an!
Post Reply

Return to “Προγραμματισμός”