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ó.

  • 🔘 String.valueOf: String.valueOf(myChar) trả về một chuỗi ký tự đơn và thể hiện rõ nhất mục đích của việc chuyển đổi.
  • ☑️ Character.toString: Character.toString(myChar) thực hiện công việc tương tự và, vì vậy Java 9, chỉ đơn giản là ủy thác cho String.valueOf.
  • charAt: charAt(index) trả về ký tự tại vị trí chỉ mục 0 và ném ngoại lệ StringIndexOutOfBoundsException nếu nằm ngoài phạm vi hợp lệ.
  • 🧪 mảng ký tự: toCharArray() chia một chuỗi thành một mảng ký tự, và new String(chars) tái tạo lại văn bản từ mảng đó.
  • 🛠️ Không tuyển diễn viên: Một chuỗi (String) không bao giờ có thể được ép kiểu thành ký tự (char), bởi vì chuỗi là một đối tượng chứ không phải là một kiểu dữ liệu nguyên thủy có liên quan.
  • 📌 Giới hạn Unicode: Một char chứa một đơn vị mã UTF-16 16 bit, vì vậy một biểu tượng cảm xúc cần hai char hoặc Character.toString(codePoint).

Java Đoạn mã chuyển đổi một ký tự thành chuỗi và một chuỗi trở lại thành ký tự.

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:

  1. Chuyển đổi ký tự thành chuỗi
  2. 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ỗiin ấn đầu ra được định dạng.

Câu Hỏi Thường Gặp

Kiểu dữ liệu `char` là một kiểu dữ liệu cơ bản chứa một đơn vị mã UTF-16 16 bit, được viết trong dấu ngoặc đơn. Kiểu dữ liệ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, và nó có các phương thức như `length()` và `charAt()` mà kiểu dữ liệu cơ bản không có.

Không, kể từ khi Java 9. Phương thức Character.toString(char) được triển khai dưới dạng lời gọi đến String.valueOf(char), vì vậy cả hai đều chạy cùng một đoạn mã. Hãy chọn phương thức nào dễ đọc hơn trong môi trường làm việc của bạn; String.format(“%c”, c) là phương thức duy nhất thực sự chậm.

Một ký tự (char) lưu trữ một đơn vị mã 16 bit, và biểu tượng cảm xúc (emoji) nằm phía trên U+FFFF. Java Chia chúng thành một cặp ký tự thay thế, sao cho mỗi cặp chiếm hai ký tự. Đọc mã điểm bằng codePointAt() và xây dựng lại văn bản bằng Character.toChars() hoặc Character.toString(codePoint).

Dây A. Java 11 đã thêm một hàm quá tải kiểu int đọc đối số của nó dưới dạng mã Unicode, và 65 là mã điểm cho A. String.valueOf(65) trả về các chữ số 65 thay vì mã điểm, điều này khiến hai lệnh gọi này dễ bị nhầm lẫn.

Nối chuỗi bằng toán tử cộng, hoặc gọi phương thức append() trên một StringBuilder khi phép cộng diễn ra bên trong một vòng lặp. Java Chuỗi (String) là kiểu dữ liệu bất biến, do đó mỗi phép nối chuỗi sẽ tạo ra một đối tượng mới thay vì kế thừa đối tượng cũ.

Không phải vì Java 9. Chuỗi nén đã thay thế mảng ký tự nội bộ bằng một mảng byte cộng với một cờ mã hóa, do đó văn bản Latin-1 thuần túy sử dụng một byte cho mỗi ký tự. Không có gì trong API công khai thay đổi và charAt() vẫn trả về một ký tự.

Các công cụ phân tích tĩnh dựa trên học máy sẽ gắn cờ các chuyển đổi đáng ngờ mà trình biên dịch chấp nhận, chẳng hạn như lệnh gọi charAt() không được bảo vệ hoặc String.valueOf(null) dẫn đến quá tải mảng char. Chúng xếp hạng các phát hiện theo xác suất, giúp loại bỏ nhiễu của một quá trình quét dựa trên quy tắc thông thường.

Trợ lý GitHub Nó tạo ra các dòng lệnh String.valueOf() và charAt() một cách đáng tin cậy, nhưng nó cũng tái tạo lại các lời khuyên lỗi thời từ dữ liệu huấn luyện của nó, chẳng hạn như hàm tạo new Character(c) đã bị loại bỏ. Hãy biên dịch mọi đề xuất và đọc các cảnh báo về việc bị loại bỏ.

Tóm tắt bài viết này với: