|
Εισαγωγή
Σε
προηγούμενο κείμενο μας
είχαμε
αναφέρει λεπτομέρειες για τους
λεγόμενου βασικούς τύπους δεδομένων στην 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
s = ("Hello");
Θα
πρέπει να είμαστε
ιδιαίτερα
προσεκτικοί με τα αντικείμενα 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
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ποστολόπουλος Πάρις
Κωνσταντινίδης
Πάνος
|