核心概念
-
char:
(图片来源网络,侵删)- 它是一个基本数据类型(primitive data type)。
- 用来表示单个字符('a', '好', '1')。
- 在 Java 中,
char是 16 位的 Unicode 字符,使用单引号 括起来。 - 内存占用固定为 2 字节。
-
String:- 它是一个对象(Object),属于
java.lang包。 - 用来表示一个或多个字符的序列("hello", "你好", "a1!")。
- 在 Java 中,
String是不可变的(immutable),一旦创建就不能被修改。 - 使用双引号 括起来。
- 它是一个对象(Object),属于
转换方法
下面我们分两种情况来讨论转换:char 转 String 和 String 转 char。
char 转 String
将单个 char 转换为 String 是非常直接和简单的,主要有以下几种方法,其中第一种是最常用和推荐的。
使用 String 的构造函数(最推荐)
这是最直观、最符合逻辑的方法。String 类提供了一个专门接受 char 参数的构造函数。

char myChar = 'A';
String str = new String(new char[]{myChar}); // 使用 char 数组构造
// 或者更简单的方式 (Java 9+)
String str2 = String.valueOf(myChar);
System.out.println(str); // 输出: A
System.out.println(str2); // 输出: A
System.out.println(str.getClass().getName()); // 输出: java.lang.String
注意:直接 new String(myChar) 是错误的,因为构造函数不接受单个 char 类型,它接受一个 char 数组。
使用 String.valueOf() 静态方法(推荐)
String 类提供了多个重载的 valueOf() 方法,可以将各种基本数据类型(包括 char)转换为 String,这是非常通用且高效的方式。
char myChar = 'B'; String str = String.valueOf(myChar); System.out.println(str); // 输出: B
使用字符串连接(简单但需注意)
你可以将一个 char 与一个空字符串 进行连接,Java 会自动将 char 转换为 String。
char myChar = 'C'; String str = "" + myChar; System.out.println(str); // 输出: C
这种方法虽然简单,但在底层会创建一个新的 StringBuilder 对象来完成连接操作,对于单个字符,性能差异可以忽略不计,但在性能敏感的循环中,应优先使用 String.valueOf()。

使用空字符串的 concat() 方法
这种方法和方法三类似,但可读性稍差,不常用。
char myChar = 'D'; String str = "".concat(String.valueOf(myChar)); System.out.println(str); // 输出: D
String 转 char
将 String 转换为 char 情况稍微复杂一些,因为 String 可以包含多个字符,我们通常需要获取 String 中的某一个字符。
使用 charAt() 方法(最常用)
如果你想获取 String 中指定位置的 char,charAt() 是标准方法,字符串的索引从 0 开始。
String myStr = "Hello";
// 获取第一个字符 (索引为 0)
char firstChar = myStr.charAt(0); // 'H'
// 获取最后一个字符
char lastChar = myStr.charAt(myStr.length() - 1); // 'o'
System.out.println("第一个字符: " + firstChar);
System.out.println("最后一个字符: " + lastChar);
重要:异常处理
如果传入的索引是负数或者大于等于字符串的长度,charAt() 会抛出 StringIndexOutOfBoundsException 异常。
String myStr = "Hi";
try {
char c = myStr.charAt(5); // 索引 5 超出范围 (长度为 2)
} catch (StringIndexOutOfBoundsException e) {
System.out.println("错误:索引超出范围!");
}
将整个 String 转换为 char 数组
如果你想获取 String 中的所有字符,可以将其转换为一个 char 数组。
String myStr = "World"; char[] charArray = myStr.toCharArray(); // 将整个字符串转为 char 数组 System.out.println(charArray[0]); // 输出 'W' System.out.println(charArray[1]); // 输出 'o' System.out.println(charArray.length); // 输出 5
特殊情况:String 长度为 1
如果你的 String 确定只包含一个字符,你可以先获取这个字符,然后将其存入一个 char 变量中。
String singleCharStr = "Z";
if (singleCharStr.length() == 1) {
char myChar = singleCharStr.charAt(0);
System.out.println(myChar); // 输出: Z
} else {
System.out.println("字符串长度不为1,不能直接转为单个char");
}
注意:不能直接将一个长度大于1的 String 赋值给 char 变量,编译器会报错。
String multiCharStr = "AB"; // char c = multiCharStr; // 编译错误: incompatible types: String cannot be converted to char
总结表格
| 转换方向 | 方法 | 示例 | 说明 |
|---|---|---|---|
char → String |
String.valueOf() |
String s = String.valueOf('c'); |
推荐,清晰、高效、通用。 |
new String(char[]) |
String s = new String(new char[]{'c'}); |
推荐,特别是处理字符数组时。 | |
| 字符串连接 | String s = "" + 'c'; |
简单,但底层有 StringBuilder 开销。 |
|
String → char |
charAt(index) |
char c = "abc".charAt(0); |
推荐,用于获取指定索引的单个字符。 |
toCharArray() |
char[] arr = "abc".toCharArray(); |
用于获取包含所有字符的字符数组。 |
最佳实践
char转String:优先使用String.valueOf(),它代码简洁,意图明确,并且是静态方法,无需创建String类的实例。String转char:- 如果只需要一个字符,使用
charAt()。 - 如果需要所有字符,使用
toCharArray()。 - 使用
charAt()时,务必进行边界检查或使用try-catch来避免StringIndexOutOfBoundsException。
- 如果只需要一个字符,使用
