Πώς να μετατρέψετε το Char σε String σε Java (Παραδείγματα)
⚡ Έξυπνη Σύνοψη
Μετατροπή ενός χαρακτήρα σε συμβολοσειρά Java δέχεται μία μόνο κλήση στο String.valueOf(myChar) ή στο Character.toString(myChar). Η κίνηση προς την αντίστροφη κατεύθυνση χρησιμοποιεί το charAt(index), το οποίο εξάγει έναν χαρακτήρα από μια συμβολοσειρά από τη θέση του.
Σε αυτό το σεμινάριο, θα μελετήσουμε δύο σύντομα προγράμματα που μετακινούν μια τιμή μεταξύ των δύο τρόπων Java αποθηκεύει κείμενο:
- Μετατροπή ενός χαρακτήρα σε συμβολοσειρά
- Μετατροπή μιας συμβολοσειράς σε χαρακτήρα
Οι δύο τύποι δεν είναι εναλλάξιμοι. Ένας χαρακτήρας (char) είναι ένα πρωτόγονο που περιέχει ακριβώς μία μονάδα κώδικα UTF-16 16-bit, γραμμένη σε μονά εισαγωγικά ως 'g'. Μια συμβολοσειρά (String) είναι ένα αντικείμενο που περιέχει μια ακολουθία αυτών των μονάδων κώδικα, γραμμένη σε διπλά εισαγωγικά ως "Guru99”. Επειδή το ένα είναι ένα πρωτόγονο και το άλλο ένα αντικείμενο, κανένα cast δεν μπορεί να τα γεφυρώσει — μια μέθοδος βιβλιοθήκης πρέπει να κάνει τη δουλειά, και Java παρέχει ένα για κάθε κατεύθυνση.
Μετατροπή Char σε String
Υπάρχουν πολλοί τρόποι για να μετατρέψετε έναν χαρακτήρα σε μια συμβολοσειρά (String) στο JavaΕσωτερικά a Java Η συμβολοσειρά αποθηκεύει το κείμενό της ως πίνακας μονάδων κώδικα, γι' αυτό και ένας μόνο χαρακτήρας εντάσσεται τόσο εύκολα σε έναν. Ένας χαρακτήρας είναι ένας μη υπογεγραμμένος τύπος δεδομένων 16-bit, πλάτους δύο byte, που περιέχει τιμές από 0 έως 65,535.
Μπορούμε να μετατρέψουμε έναν χαρακτήρα σε συμβολοσειρά χρησιμοποιώντας 2 μεθόδους — τη static μέθοδο toString() στην κλάση Character και τη static μέθοδο valueOf() στην κλάση String. Και οι δύο επιστρέφουν μια ολοκαίνουργια συμβολοσειρά μήκους ενός χαρακτήρα και τα δύο προγράμματα παρακάτω εκτυπώνουν το ίδιο αποτέλεσμα.
Μέθοδος 1: Χρησιμοποιώντας τη μέθοδο toString().
Το παρακάτω πρόγραμμα αποθηκεύει το γράμμα g σε ένα char μεταβλητή και το μεταβιβάζει στην Character.toString(), η οποία επιστρέφει αυτόν τον μοναδικό χαρακτήρα ως String. Ο κώδικας είναι επεξεργάσιμος, οπότε αλλάξτε το γράμμα και εκτελέστε τον ξανά για να παρακολουθήσετε την έξοδο να ακολουθεί.
public class CharToString_toString {
public static void main(String[] args) {
//input character variable
char myChar = 'g';
//Using toString() method
//toString method take character parameter and convert string.
String myStr = Character.toString(myChar);
//print string value
System.out.println("String is: " + myStr);
}
}
Αναμενόμενη έξοδος:
String is: g
Μέθοδος 2: Χρησιμοποιώντας τη μέθοδο valueOf().
Το δεύτερο πρόγραμμα αλλάζει το String.valueOf(myChar) και δεν αλλάζει τίποτα άλλο. Εφόσον Java 9 οι δύο κλήσεις είναι η ίδια λειτουργία: Η Character.toString(char) υλοποιείται ως κλήση της String.valueOf(char), επομένως καμία από τις δύο δεν είναι μετρήσιμα ταχύτερη από την άλλη.
public class CharToString_valueOf {
public static void main(String[] args) {
char myChar = 'g';
//valueOf method take character parameter and convert string.
String myStr = String.valueOf(myChar);
////print string value
System.out.println("String is: " + myStr);
}
}
Αναμενόμενη έξοδος:
String is: g
Άλλοι τρόποι μετατροπής ενός χαρακτήρα σε συμβολοσειρά
Τέσσερις ακόμη διαδρομές εμφανίζονται σε παλαιότερο κώδικα και σε ερωτήσεις συνέντευξης. Όλες λειτουργούν, αλλά καμία από αυτές δεν διαβάζεται τόσο ξεκάθαρα όσο οι δύο παραπάνω μέθοδοι, και δύο από αυτές διαθέτουν περισσότερα από όσα χρειάζονται.
public class CharToStringMore { public static void main(String[] args) { char myChar = 'g'; // 1. concatenation with an empty literal String byConcat = myChar + ""; // 2. the Character wrapper instance method String byWrapper = Character.valueOf(myChar).toString(); // 3. a one-element array of code units String byArray = new String(new char[]{myChar}); // 4. the format() helper with the %c conversion String byFormat = String.format("%c", myChar); System.out.println(byConcat + byWrapper + byArray + byFormat); } }
Αναμενόμενη παραγωγή:
gggg
Ο πίνακας αναφέρει πότε αξίζει να χρησιμοποιηθεί κάθε διαδρομή.
| Μέθοδος | Παράδειγμα | Σημειώσεις |
|---|---|---|
| String.valueOf(char) | String.valueOf(myChar) | Συνιστάται. Μία κλήση, κανένα επιπλέον αντικείμενο πέρα από τη συμβολοσειρά που επιστράφηκε. |
| Character.toString(char) | Character.toString(myChar) | Εξίσου καλό. Διαθέσιμο από Java 1.4 και αναθέτει σε String.valueOf από τότε Java 9. |
| Αληλουχία | myChar + “” | Λειτουργεί, και σε Java 9 και νεότερες εκδόσεις, μεταγλωττίζεται σε μια κλήση invokedynamic αντί για ένα StringBuilder, επομένως η παλιά προειδοποίηση ότι είναι αργή δεν ισχύει πλέον. Εξακολουθεί να κρύβει την πρόθεση. |
| Περιτύλιγμα χαρακτήρων | Character.valueOf(myChar).toString() | Boxes πρώτα ο χαρακτήρας. Χρησιμοποιήστε Character.valueOf, όχι τον νέο κατασκευαστή Character(char), ο οποίος έχει καταργηθεί για αφαίρεση από τότε Java 9. |
| πίνακας χαρακτήρων | νέα συμβολοσειρά(νέος χαρακτήρας[]{myChar}) | Κατανέμει έναν πίνακα και τον αντιγράφει. Κρατήστε τον για την περίπτωση όπου ήδη έχετε έναν πίνακα char. |
| Σειρά χαρακτήρων.μορφή | String.format(“%c”, myChar) | Είναι μακράν το πιο αργό, επειδή η συμβολοσειρά μορφοποίησης αναλύεται κατά τον χρόνο εκτέλεσης. Χρήσιμο μόνο όταν ο χαρακτήρας είναι μέρος ενός μεγαλύτερου προτύπου. |
Έχοντας καλύψει και τις δύο κατευθύνσεις της μετατροπής ενός χαρακτήρα, ακολουθεί η αντίστροφη λειτουργία.
Μετατροπή συμβολοσειράς σε χαρακτήρες
Μπορούμε να μετατρέψουμε ένα String σε char χρησιμοποιώντας τη μέθοδο charAt() της κλάσης String. Η μέθοδος δέχεται έναν δείκτη που βασίζεται στο μηδέν και επιστρέφει τον char που βρίσκεται σε αυτήν τη θέση, επομένως η ανάγνωση κάθε χαρακτήρα σημαίνει τουαλέταping από 0 έως length() μείον ένα. Η ερώτηση για δείκτη κάτω από το 0 ή σε length() και πάνω προκαλεί την συνάρτηση StringIndexOutOfBoundsException.
Το παρακάτω πρόγραμμα περπατάει στο String Guru99 μία θέση κάθε φορά και εκτυπώνει κάθε χαρακτήρα με τον δείκτη του.
//Convert String to Character using string method
package com.guru99;
public class StringToChar {
public static void main(String[] args)
{
//input String
String myStr = "Guru99";
//find string length using length method.
int stringLength =myStr.length();
//for loop start 0 to total length
for(int i=0; i < stringLength;i++)
{
//chatAt method find Position and convert to character.
char myChar = myStr.charAt(i);
//print string to character
System.out.println("Character at "+i+" Position: "+myChar);
}
}
}
Αναμενόμενη παραγωγή:
Character at 0 Position: G Character at 1 Position: u Character at 2 Position: r Character at 3 Position: u Character at 4 Position: 9 Character at 5 Position: 9
Σημειώστε ότι μια συμβολοσειρά δεν μπορεί να μεταφερθεί απλώς: η συνάρτηση char c = (char) myStr; δεν μεταγλωττίζεται, επειδή μια συμβολοσειρά είναι ένα αντικείμενο και ένας char είναι ένα primitive. Για μια συμβολοσειρά που είναι ήδη γνωστό ότι περιέχει ακριβώς έναν χαρακτήρα, η συνάρτηση charAt(0) είναι η πλήρης απάντηση.
Μετατροπή μιας συμβολοσειράς σε πίνακα χαρακτήρων και αντίστροφα
Όταν χρειάζεται κάθε χαρακτήρας ταυτόχρονα αντί για έναν δείκτη κάθε φορά, η εντολή toCharArray() επιστρέφει την τιμή. ένας νέος πίνακας χαρακτήρωνΗ μετατροπή αυτού του πίνακα ξανά σε κείμενο είναι δουλειά του κατασκευαστή String(char[]) ή του String.valueOf(char[]), και οι δύο αντιγράφουν τον πίνακα αμυντικά, επομένως οι μεταγενέστερες επεξεργασίες στον πίνακα δεν αλλοιώνουν τη συμβολοσειρά.
public class StringCharArray { public static void main(String[] args) { String myStr = "Guru99"; // the text split into its array of code units char[] chars = myStr.toCharArray(); System.out.println(chars.length); System.out.println(chars[0]); // the array turned back into text System.out.println(new String(chars)); System.out.println(String.valueOf(chars)); // one range copied into an array you already own char[] part = new char[4]; myStr.getChars(0, 4, part, 0); System.out.println(new String(part)); } }
Αναμενόμενη παραγωγή:
6 G Guru99 Guru99 Guru
Μια τέταρτη μέθοδος, η getChars(srcBegin, srcEnd, dst, dstBegin), αντιγράφει μια περιοχή σε έναν πίνακα που ήδη κατέχετε αντί να εκχωρήσει έναν νέο. Ο δείκτης end είναι αποκλειστικός, γι' αυτό και η getChars(0, 4, part, 0) αποδίδει Guru αντί Guru9. Τα όρια εκτός εύρους προκαλούν IndexOutOfBoundsException.
Οι τρεις προσεγγίσεις διαφέρουν κυρίως ως προς το τι κατανέμουν, όπως συνοψίζεται παρακάτω.
| Έργο | Καλέστε | Τι διαθέτει |
|---|---|---|
| Πίνακας από συμβολοσειρά σε χαρακτήρα | myStr.toCharArray() | Ένας νέος πίνακας· ασφαλής σε μια κενή συμβολοσειρά, όπου επιστρέφει έναν πίνακα μηδενικού μήκους. |
| πίνακας char σε συμβολοσειρά | νέο String(chars) ή String.valueOf(chars) | Μια νέα συμβολοσειρά συν ένα εσωτερικό αντίγραφο του πίνακα. |
| Εύρος σε έναν υπάρχοντα πίνακα | myStr.getChars(0, 4, μέρος, 0) | Τίποτα καινούργιο· γράφει στον πίνακα που παρέχετε. |
Συνηθισμένα σφάλματα κατά τη μετατροπή χαρακτήρων και συμβολοσειρών Java
Τα περισσότερα προβλήματα σε αυτές τις μετατροπές προέρχονται από έξι επαναλαμβανόμενα λάθη και όχι από τις ίδιες τις μεθόδους. Ο πίνακας αντιστοιχίζει το καθένα με τη διόρθωση.
| Πρόβλημα | Αιτία | σταθερός |
|---|---|---|
| ασύμβατοι τύποι: Η συμβολοσειρά δεν μπορεί να μετατραπεί σε χαρακτήρες (char) | Μια προσπάθεια μετατροπής, όπως char c = (char) myStr; | Καλέστε αντ' αυτού την εντολή myStr.charAt(0). Δεν υπάρχει σύνδεση μεταξύ ενός αντικειμένου και ενός primitive. |
| Εξαίρεση StringIndexOutOfBounds | Η charAt() καλείται με αρνητικό δείκτη ή με length() σε κενή συμβολοσειρά | Χρησιμοποιήστε την εντολή Guard με την εντολή isEmpty() ή συγκρίνετε τον δείκτη με την εντολή length() πριν την ανάγνωση. |
| Το String.valueOf(null) εμφανίζει την Εξαίρεση NullPointer | Το bare null ταιριάζει με την υπερφόρτωση char[], η οποία είναι η πιο συγκεκριμένη | Γράψτε String.valueOf((Object) null) όταν το κείμενο null είναι αυτό που θέλετε. |
| Η συνάρτηση Character.toString(65) επιστρέφει A, όχι 65 | Java Το 11 πρόσθεσε μια υπερφόρτωση Character.toString(int) που διαβάζει το όρισμά του ως σημείο κώδικα Unicode. | Χρησιμοποιήστε String.valueOf(65) ή Integer.toString(65) για τα ψηφία 65. |
| Ένα emoji εκτυπώνεται ως δύο παραμορφωμένα σύμβολα | Οι χαρακτήρες πάνω από U+FFFF καταλαμβάνουν δύο χαρακτήρες, έναν υψηλό υποκατάστατο ακολουθούμενο από έναν χαμηλότερο υποκατάστατο | Διαβάστε την τιμή με το codePointAt(0) και, στη συνέχεια, ανακατασκευάστε την με το Character.toString(codePoint) στο Java 11 και μετά. |
| Προειδοποίηση κατάργησης για νέο χαρακτήρα (myChar) | Ο κατασκευαστής Character(char) έχει καταργηθεί από τότε Java 9 και σημειωμένο για αφαίρεση | Χρησιμοποιήστε την Character.valueOf(myChar) ή αφήστε την αυτόματη κωδικοποίηση να παρέχει το περιτύλιγμα. |
Η ίδια κλάση String υποστηρίζει πολλές γειτονικές ασκήσεις: αντιστροφή μιας συμβολοσειράς με αναδρομή, σύγκριση δύο συμβολοσειρώνκαι εκτύπωση μορφοποιημένης εξόδου.
