Java Hellenic User Group logo

Αρχική Σελίδα
Αγορά Συζήτησης
Κείμενα/Βοηθήματα

Valid CSS!

Εισαγωγή στην κλάση java.String

Εισαγωγή

Σε προηγούμενο κείμενο μας είχαμε αναφέρει λεπτομέρειες για τους λεγόμενου βασικούς τύπους δεδομένων στην Java Abstract Data Types). Τύποι όπως οι χαρακτήρες char,οι ακέραιοι int, οι δεκαδικοί float αλλά και άλλοι αποτελούν αναπόσπαστο κομμάτι σχεδόν κάθε προγράμματός μας. Παρόλα αυτά είχαμε αναφέρει ότι ένα ακόμα τύπος δεδομένου μπορεί να χαρακτηριστεί ως βασικός, αλλά εξαιτίας της φυσιολογίας του στην Java δεν μπορεί να καταχωρηθεί μαζί με τους υπόλοιπους. Ο τύπος αυτός είναι η 'λέξη' (String). Ανήκει σε μια άλλη ομάδα τύπων δεδομένων που ονομάζονται Advanced Data Types ή Wrapper Data Types (σύνθετοι τύποι δεδομένων). Αναφορικά να πούμε ότι σχεδόν κάθε βασικός τύπος που έχουμε αναφέρει έχει και τον αντίστοιχο σύνθετο τύπο.

Κυρια χαρακτηριστικα του τύπου 'λέξη' είναι ότι πρόκειται για μια κλάση (java.lang.String)της οποία χρησιμοποιούμε τους αντίστοιχους κατασκευαστές (constructors) για δημιουργήσουμε ανάλογα αντικείμενα. Γυρνώντας πίσω σε αυτά που αναφέραμε τότε για τους βασικούς τύπους, βλέπουμε ότι η έννοια της κλάσης και της δημιουργίας αντικειμένων (objects) και αναφορών (references) δεν είχε χρησιμοποιηθεί. Αν παραδείγματος χάρη θέλαμε να δημιουργήσουμε μια μεταβλητή στην οποία θα αποθηκεύαμε την τιμή ενός ακεραίου πολύ απλά θα χρησιμοποιούσαμε κάτι σαν αυτό που δείχνει ο κώδικας παρακάτω.

   int x = 12;

Ειδικά χαρακτηριστικά των λέξεων στην Java

Προτού αναφέρουμε διάφορους σημαντικούς τρόπους με τους οποίους μπορούμε να δημιουργήσουμε αντικείμενα της κλάσης (String), πρέπει να πούμε μερικά πράγματα τα οποία είναι σημαντικά, όσο αναφορά τα χαρακτηριστικά των συγκεκριμένων αντικειμένων.

  • Τα αντικείμενα λέξεων (String objects) δεν είναι τίποτα άλλο παρά ένας πίνακας, μια συλλογή χαρακτήρων τα οποία  συμπεριφέρονται σαν μια οντότητα.

String s = ("Hello");

0

1

2

3

4

H

e

l

l

o

Θα πρέπει να είμαστε ιδιαίτερα προσεκτικοί με τα αντικείμενα String και τον τρόπο που αριθμούντε οι χαρακτήρες σε αυτά. Δεν πρέπει ποτέ να ξεχνάμε ότι πάντα ο πρώτος χακτήρας στον πίνακα έχει τη θέση 0 και όχι 1 .Αυτό είναι γενικό φαινόμενο σε όλα τα αντικείμενα αλλά και δομές πινάκων στην Java.Πολλά από τα λάθη των αρχαρίων όσον αφορά τη χρησιμοποίηση λέξεων ξεκινούν με το να θεωρούν ότι ο πρώτος χαρακτήρας της λέξης έχει θέση (index) 1 και όχι 0 .Είναι το ίδιο με το παρακάτω .

char[5] aCharArray;
 
char[0] = 'H';
char[1] = 'e';
char[2] = 'l';
char[3] = 'l';
char[4] = 'o';
  • Όταν δημιουργούμε ένα αντικείμενο της κλάσης String και του δίνουμε μια συγκεκριμένη τιμή, τότε από εκεί και πέρα το συγκεκριμένο αντικείμενο δεν μπορούμε εμείς να το μεταβάλλουμε. Δηλαδή τα αντικείμενα της κλάσης λέξη (String) θεωρούνται αμετάβλητα. Για να μπορέσουμε να τα μεταβάλουμε τότε πρέπει να δημιουργήσουμε εκ νέου ένα αντικείμενο με αλλαγμένη τιμή.

Ας δούμε τον παρακάτω κώδικα :

//creation and initialization of a String object
String s = new String ("Hello World");
s=new String("new Hello world");

Στον παραπάνω κώδικα βλέπουμε ότι δημιουργούμε ένα αντικείμενο της κλάσης String και του δίνουμε την τιμή "Hello World". Με αλλά λόγια έχουμε δημιουργήσει μια αναφορά (reference) του τύπου String (s) και η αναφορά (s) δείχνει σε συγκεκριμένο χώρο της μνήμης μας όπου έχει δεσμευτεί και αποθηκεύεται η σειρά χαρακτήρων ("Hello World"). Αν θέλουμε αν αλλάξουμε την τιμή αυτή και αντί για "Hello World" να έχουμε "new Hello World", τότε   αυτό που μπορούμε να κάνουμε είναι να χρησιμοποιήσουμε την αναφορά του τύπου String (s) και να της αναθέσουμε να δένει (αναφέρει) σε έναν καινούργιο δεσμευμένο χώρο στην μνήμη όπου έχουμε καταχωρήσει μια νέα σειρά χαρακτήρων ("new Hello World"). Όπως καταλαβαίνουμε λοιπόν ο ήδη δεσμευμένος χώρος στην μνήμη που κρατά την σειρά χαρακτήρων "Hello World" παραμένει όπως έχει, θα γίνει ξανά διαθέσιμος για νέα αποθήκευση μόνο όταν ο Garbage Collector της εικονικής μηχανής Java αντιληφθεί ότι δεν υπάρχουν αναφορές (references) στον χώρο αυτό και έτσι θα μπορέσει να σβήσει την οποία αποθηκευμένη τιμή. Κάτι άλλο που μπορούμε να παρατηρήσουμε είναι ότι η συνεχής δημιουργία αντικειμένων της κλάσης String ενδέχεται σε μερικές περιπτώσεις (υπερβολική και απερίσκεπτη χρήση) να δημιουργήσει προβλήματα επιδόσεων και κατανάλωσης μνήμης. Γι' αυτό συνίσταται να είμαστε ιδιαίτερα προσεκτικοί στην δημιουργία τέτοιων αντικειμένων και όταν μπορούμε να χρησιμοποιούμε βοηθητικές κλάσεις όπως java.lang.StringBuffer.Η συγκεκριμένη κλάση είναι συγγενικής χρηστικότητας με την String μόνο που τα αντικείμενα της δεν έχουν το χαρακτηριστικού του αμετάβλητου όπως γίνεται με τα αντικείμενα της (String).

Με αντικείμενα String μπορούμε να χρησιμοποιήσουμε τον χαρακτήρα της πρόσθεσης (+) για να πραγματοποιήσουμε προσθέσεις λέξεων (ενώσεις).

String s = "a string";
String s2 = "another String";
 
String s3 = s+s2;//perform String concatenation
 
System.out.println(s3); //print out the new string
 

Οι παραπάνω γραμμές κώδικα αν βρεθούν μέσα σε κάποια μέθοδο και τρέξετε την αντίστοιχη κλάση θα σας τυπώσουν το αποτέλεσμα της ένωσης των λέξεων s και s2 , το οποίο θα είναι ("a string another String"); Η χρησιμοποίηση του (+) για την συγκεκριμένη λειτουργία αποτελεί μοναδικό προνόμιο των συγκεκριμένων αντικειμένων .

Δημιουργία αντικειμένων της κλάσης String

Η κλάση String έχει να παρουσιάσει 11 διαφορετικούς τρόπους, με τους οποίους μπορούμε να δημιουργήσουμε αντίστοιχα αντικείμενα. Παρακάτω αναφέρουμε με παραδείγματα μερικούς σημαντικούς.

  • Χρησιμοποίηση του απλού κατασκευαστή.

String s = new String("Hello World");
  • Δημιουργία αντικειμένου String χωρίς την χρήσιμoποίηση της λέξης new

String s = "Hello World";
  • Δημιουργία αντικειμένου , χρησιμοποιώντας τον κατασκευαστή που δέχεται ως παράμετρο έναν πίνακα χαρακτήρων .

//creation and initialization of a character array
char[] aCharArray = {'H','e','l','l','o',
                     'W','o','r','l','d'};
 
String s = new String (aCharArray)

Ο συγκεκριμένος κατασκευαστής δέχεται και άλλες παραμέτρους όποτε μπορεί να εμφανιστεί και με τις εξής εκδοχές

String s = new String(aCharArray , 2, 5);

Όπου οι αριθμοί 2 και 5 αποτελούν τις παραμέτρους που ορίζουν πόσοι χαρακτήρες από τον πίνακα (aCharArray) θα συμπεριληφθούν στο νέο αντικείμενο (στην προκείμενη περίπτωση 5) και από ποιον χαρακτήρα (offset) θα αρχίσουμε να συμπεριλαμβάνουμε χαρακτήρες για τον αντικείμενο μας, στην προκειμένη περίπτωση τον (0 πρώτο χαρακτήρα). Η λέξη που θα προκύψει από τον συγκεκριμένο κατασκευαστή είναι η 'Hello'.

Ιδιοτυπίες της κλάσης String

Η κλάση String είναι από τις πιο ιδιότυπες (αν όχι η πιο ιδιότυπη) στη Java. Είναι η μοναδική κλάση που μπορούμε να δημιουργήσουμε αντικείμενο χωρίς τη λέξη κλειδί new ή χωρίς να φορτώσουμε την κλάση δυναμικά, παρά μόνο χρησιμοποιώντας το χαρακτήρα '='(π.χ. String car = "Mercedes";).Τα String που δημιουργούνται με τον παραπάνω τρόπο συχνά αναφέρονται και ως String σταθερές (string constants)  να μην μπερδεύεται με τις σταθερές/τελικές μεταβλητές που δηλώνονται με τη λέξη final) ή ανώνυμα String (string anonymous). Η εικονική μηχανή συμπεριφέρεται σε όλα τα string constants που έχουνε την ίδια τιμή ως ένα String που αναφέρεται στην ίδια τοποθεσία της μνήμης. Δε συμβαίνει όμως το ίδιο και με αυτά που δημιουργούνται χρησιμοποιώντας τη λέξη new. Ο λόγος πίσω από αυτό είναι η βελτιστοποίηση ενός προγράμματος και η εξοικονόμηση μνήμης, μιας και η κλάση String είναι από τις πιο πολύχρηστες στη Java και συχνά χρησιμοποιείται αλόγιστα.

Αν για παράδειγμα δημιουργήσουμε δύο αντικείμενα ως:

String s1 = "hello";
String s2 = "hello";

τότε η Java θα τους συμπεριφερθεί ως ένα αντικείμενο το οποίο αναφέρεται από δύο διαφορετικές μεταβλητές. Η σύγκρισή τους με το χαρακτήρα ισότητας θα βγει πάντα αληθινή:

s1 == s2 θα είναι πάντα true.

Αντιθέτως αν δημιουργήσουμε δύο αντικείμενα ως:

String s1 = new Sring("hello");
String s2 = new String("hello");

τότε η Java θα τους συμπεριφερθεί ως δύο διαφορετικά αντικείμενα που αναφέρονται από δύο διαφορετικές μεταβλητές. Η σύγκρισή τους με το χαρακτήρα ισότητας θα βγει πάντα ψεύτικη:

s1 == s2 θα είναι πάντα false.

Ο χαρακτήρας ισότητας χρησιμοποιείται για να συγκρίνουμε τις διευθύνσεις της μνήμης στις οποίες δείχνουνε οι αναφορές (στο παράδειγμά μας s1 και s2) και όχι τα περιεχόμενα της μνήμης αυτής. Με λίγα λόγια είναι οι αριθμοί όπως 0x3148 που συγκρίνονται και όχι οι λέξεις hello. Από τη στιγμή που έχουμε δημιουργήσει δύο όμοια String αντικείμενα με το χαρακτήρα '=' και αναφερόμαστε σε αυτά με δύο διαφορετικές αναφορές (s1 και s2) τότε η Java θα φερθεί σαν να έχουμε δημιουργήσει ένα αντικείμενο που αναφέρεται από τις δύο διαφορετικές αναφορές s1 και s2.

Επίλογος

Η κλάση String είναι πλούσια σε μεθόδους, πάνω από 40 μέθοδοι βρίσκονται στην διάθεση μας, ώστε να κάνουν την χρησιμοποίηση των String αντικειμένων πιο εύκολη και λειτουργική .O καλύτερος οδηγός για την εκμάθηση αλλά και χρησιμοποίηση των μεθόδων , δεν είναι άλλος από το επίσημο Java ΑPI Documentation (http://java.sun.com/j2se/1.4/docs/api/index.html ), το οποίο εξηγεί τα χαρακτηριστικά και την χρησιμότητα κάθε μεθόδου . Συνιστούμε για λόγους ευχρηστίας το Java API να το έχετε διαθέσιμο και τοπικά στον υπολογιστή σας , και όχι μόνο μέσω πρόσβασης στο Internet .Το link για να κατεβάσετε το Sun Java 1.4 SDK API είναι ( http://java.sun.com/j2se/1.4/download.html ).

Aποστολόπουλος Πάρις
Κωνσταντινίδης Πάνος


Oreilly User Group Member Get Java Now!