Cách chuyển đổi Char thành chuỗi trong Java (Ví dụ)
⚡ Tóm tắt thông minh
Chuyển đổi một ký tự thành chuỗi trong Java Thao tác này chỉ cần một lần gọi đến String.valueOf(myChar) hoặc Character.toString(myChar). Thao tác ngược lại sử dụng charAt(index), phương thức này trích xuất một ký tự từ chuỗi dựa trên vị trí của nó.
Trong bài hướng dẫn này, chúng ta sẽ nghiên cứu hai chương trình ngắn di chuyển một giá trị giữa hai chiều. Java lưu trữ văn bản:
- Chuyển đổi ký tự thành chuỗi
- Chuyển đổi chuỗi thành ký tự
Hai kiểu dữ liệu này không thể thay thế cho nhau. Kiểu char là một kiểu dữ liệu nguyên thủy chứa chính xác một đơn vị mã UTF-16 16 bit, được viết trong dấu ngoặc đơn là 'g'. Kiểu string là một đối tượng chứa một chuỗi các đơn vị mã đó, được viết trong dấu ngoặc kép là “”.Guru99”. Vì một cái là kiểu dữ liệu nguyên thủy và cái kia là kiểu dữ liệu đối tượng, nên không có phép ép kiểu nào có thể kết nối chúng — một phương thức thư viện phải thực hiện việc đó, và Java Cung cấp một chiếc cho mỗi hướng.
Chuyển đổi Char thành chuỗi
Có nhiều cách để chuyển đổi một ký tự (char) thành chuỗi (String). JavaBên trong a Java Chuỗi lưu trữ văn bản của nó. Nó được xem như một mảng các đơn vị mã, đó là lý do tại sao một ký tự đơn lẻ có thể dễ dàng khớp vào một mảng như vậy. Một ký tự là kiểu dữ liệu không dấu 16 bit, rộng hai byte, chứa các giá trị từ 0 đến 65,535.
Chúng ta có thể chuyển đổi một ký tự (char) thành một chuỗi (String) bằng 2 phương pháp — phương thức tĩnh toString() của lớp Character và phương thức tĩnh valueOf() của lớp String. Cả hai đều trả về một chuỗi mới có độ dài một ký tự, và hai chương trình bên dưới in ra cùng một kết quả.
Cách 1: Sử dụng phương thức toString()
Chương trình bên dưới lưu trữ chữ cái g trong một biến. biến char và truyền nó cho Character.toString(), phương thức này sẽ trả về ký tự đó dưới dạng chuỗi. Mã này có thể chỉnh sửa được, vì vậy hãy thay đổi chữ cái và chạy lại để xem kết quả.
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);
}
}
Đầu ra dự kiến:
String is: g
Cách 2: Sử dụng phương thức valueOf()
Chương trình thứ hai thay thế bằng String.valueOf(myChar) và không thay đổi gì khác. Vì vậy, Java 9. Hai lệnh gọi này thực hiện cùng một thao tác: Character.toString(char) được triển khai như một lệnh gọi tới String.valueOf(char), vì vậy không có lệnh nào nhanh hơn lệnh kia một cách đáng kể.
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);
}
}
Đầu ra dự kiến:
String is: g
Các cách khác để chuyển đổi ký tự thành chuỗi
Bốn phương pháp khác xuất hiện trong các đoạn mã cũ hơn và trong các câu hỏi phỏng vấn. Tất cả đều hoạt động, nhưng không phương pháp nào dễ hiểu như hai phương pháp trên, và hai trong số đó cấp phát bộ nhớ nhiều hơn mức cần thiết.
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); } }
Đầu ra mong đợi:
gggg
Bảng này nêu rõ thời điểm thích hợp để sử dụng từng tuyến đường.
| Phương pháp | Ví dụ | Ghi Chú |
|---|---|---|
| String.valueOf(char) | String.valueOf(myChar) | Được đề xuất. Chỉ cần một lệnh gọi, không có đối tượng bổ sung nào ngoài chuỗi String được trả về. |
| Character.toString(char) | Character.toString(myChar) | Cũng tốt như nhau. Có sẵn từ... Java 1.4 và ủy quyền cho String.valueOf kể từ đó Java 9. |
| Sự kết hợp | myChar + “” | Các tác phẩm, và trên Java Từ phiên bản 9 trở đi, nó được biên dịch thành một lệnh gọi invokedynamic thay vì StringBuilder, vì vậy cảnh báo cũ về việc nó chậm không còn đúng nữa. Tuy nhiên, nó vẫn che giấu ý định ban đầu. |
| Trình bao bọc nhân vật | Character.valueOf(myChar).toString() | BoxHãy sử dụng char trước. Sử dụng Character.valueOf, chứ không phải hàm tạo new Character(char), hàm tạo này đã bị loại bỏ từ lâu. Java 9. |
| mảng ký tự | new String(new char[]{myChar}) | Cấp phát một mảng và sao chép nó. Chỉ nên sử dụng hàm này trong trường hợp bạn đã có sẵn một mảng ký tự. |
| Chuỗi.định dạng | String.format(“%c”, myChar) | Đây là phương pháp chậm nhất, vì chuỗi định dạng được phân tích cú pháp trong quá trình thực thi. Chỉ hữu ích khi ký tự đó là một phần của mẫu lớn hơn. |
Sau khi đã trình bày cả hai chiều chuyển đổi ký tự đơn, bước tiếp theo là thao tác ngược lại.
Chuyển chuỗi thành ký tự
Chúng ta có thể chuyển đổi một chuỗi (String) thành ký tự (char) bằng cách sử dụng phương thức `charAt()` của lớp `String`. Phương thức này nhận một chỉ mục dựa trên 0 và trả về ký tự nằm ở vị trí đó, vì vậy việc đọc từng ký tự có nghĩa là... looping Từ 0 đến độ dài() trừ đi một. Yêu cầu chỉ mục nhỏ hơn 0 hoặc bằng độ dài() trở lên sẽ gây ra ngoại lệ StringIndexOutOfBoundsException.
Chương trình bên dưới duyệt qua chuỗi String. Guru99 vị trí một và in mỗi ký tự cùng với chỉ số của nó.
//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);
}
}
}
Đầu ra mong đợi:
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
Lưu ý rằng một chuỗi không thể được ép kiểu đơn giản: char c = (char) myStr; không biên dịch được, bởi vì chuỗi là một đối tượng và char là một kiểu dữ liệu nguyên thủy. Đối với một chuỗi đã biết chỉ chứa chính xác một ký tự, charAt(0) là câu trả lời đầy đủ.
Chuyển đổi chuỗi thành mảng ký tự và ngược lại.
Khi cần xử lý tất cả các ký tự cùng một lúc thay vì từng ký tự một, phương thức toCharArray() sẽ trả về giá trị trả về. một mảng ký tự mớiViệc chuyển đổi mảng đó trở lại thành văn bản là nhiệm vụ của hàm tạo String(char[]) hoặc String.valueOf(char[]), và cả hai đều sao chép mảng một cách an toàn, do đó các chỉnh sửa sau này đối với mảng sẽ không làm thay đổi chuỗi.
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)); } }
Đầu ra mong đợi:
6 G Guru99 Guru99 Guru
Phương pháp thứ tư, getChars(srcBegin, srcEnd, dst, dstBegin), sao chép một phạm vi vào một mảng mà bạn đã sở hữu thay vì cấp phát một mảng mới. Chỉ số cuối là độc quyền, đó là lý do tại sao getChars(0, 4, part, 0) trả về Guru chứ không phải là Guru9. Nếu phạm vi truy cập nằm ngoài giới hạn, sẽ xảy ra lỗi IndexOutOfBoundsException.
Ba phương pháp này khác nhau chủ yếu ở việc phân bổ nguồn lực, như được tóm tắt dưới đây.
| Nhiệm vụ | Gọi số | Nó phân bổ những gì |
|---|---|---|
| Chuỗi thành mảng ký tự | myStr.toCharArray() | Một mảng mới; an toàn khi nhận đầu vào là chuỗi rỗng, trong trường hợp đó nó trả về một mảng có độ dài bằng không. |
| chuyển đổi mảng ký tự thành chuỗi | new String(chars) or String.valueOf(chars) | Một chuỗi mới cộng với một bản sao nội bộ của mảng. |
| Thêm phạm vi vào mảng hiện có | myStr.getChars(0, 4, part, 0) | Không có gì mới; nó ghi vào mảng mà bạn cung cấp. |
Các lỗi thường gặp khi chuyển đổi kiểu char và string thành... Java
Hầu hết các vấn đề trong quá trình chuyển đổi này xuất phát từ sáu lỗi thường gặp chứ không phải từ chính phương pháp. Bảng dưới đây sẽ ghép mỗi lỗi với cách khắc phục tương ứng.
| Vấn đề | Nguyên nhân | Sửa chữa |
|---|---|---|
| Các kiểu dữ liệu không tương thích: Chuỗi không thể chuyển đổi thành ký tự. | Một nỗ lực để chuyển đổi kiểu dữ liệu, ví dụ như char c = (char) myStr; | Hãy gọi myStr.charAt(0) thay vì vậy. Không có phép ép kiểu giữa một đối tượng và một kiểu dữ liệu nguyên thủy. |
| Ngoại lệ chỉ mục chuỗi vượt quá giới hạn | Hàm charAt() được gọi với chỉ số âm, hoặc với hàm length() trên một chuỗi rỗng. | Kiểm tra bằng isEmpty() hoặc so sánh chỉ mục với length() trước khi đọc. |
| String.valueOf(null) throws NullPointerException | Giá trị null đơn thuần khớp với phương thức quá tải char[], đây là phương thức cụ thể nhất. | Viết String.valueOf((Object) null) khi văn bản null là thứ bạn muốn. |
| Character.toString(65) trả về A, chứ không phải 65 | Java Phiên bản 11 đã thêm một phương thức quá tải Character.toString(int) đọc đối số của nó dưới dạng một điểm mã Unicode. | Sử dụng String.valueOf(65) hoặc Integer.toString(65) cho các chữ số 65. |
| Biểu tượng cảm xúc được in ra dưới dạng hai ký hiệu bị biến dạng. | Các ký tự trên U+FFFF chiếm hai ký tự, một ký tự thay thế cao theo sau bởi một ký tự thay thế thấp. | Đọc giá trị bằng codePointAt(0), sau đó xây dựng lại nó bằng Character.toString(codePoint) trên Java 11 trở đi. |
| Cảnh báo lỗi thời trên đối với Character mới (myChar) | Hàm tạo Character(char) đã bị loại bỏ từ lâu. Java 9 và được đánh dấu để loại bỏ | Sử dụng Character.valueOf(myChar), hoặc để tính năng tự động đóng gói cung cấp trình bao bọc. |
Lớp String tương tự hỗ trợ rất nhiều bài tập liên quan khác: Đảo ngược chuỗi bằng đệ quy, so sánh hai chuỗivà in ấn đầu ra được định dạng.
