核心区别(一句话总结)
char:单个字符,它是 Java 的基本数据类型,用单引号 表示。'A','中','1'。String:字符串,它是 Java 的类(对象),用双引号 表示,它是一个由零个或多个char组成的字符序列。"Hello","Java"。
char - 字符
char 是 Character 类型的简写,它是一个 16 位的无符号基本数据类型,用于表示一个 Unicode 字符。

特点:
- 基本数据类型:不是对象,存储在栈中,效率更高。
- 单引号:使用单引号 来表示。
char c = 'A'; - Unicode 字符:可以表示任何 Unicode 字符,包括英文字母、数字、汉字、特殊符号等。
char letter = 'A'; char digit = '9'; char chineseChar = '中'; char symbol = '@';
- 转义字符:可以使用转义字符来表示一些特殊字符。
char newline = '\n'; // 换行符 char tab = '\t'; // 制表符 char singleQuote = '\''; // 单引号本身 char backslash = '\\'; // 反斜杠本身
常用操作:
char 的操作相对简单,主要是比较和转换。
public class CharExample {
public static void main(String[] args) {
char c1 = 'a';
char c2 = 'b';
// 1. 比较
if (c1 < c2) {
System.out.println("'a' is less than 'b'"); // 输出
}
// 2. 与 int 互相转换
// char -> int (获取其 Unicode 码点值)
int codePoint = c1;
System.out.println("The Unicode code point of 'a' is: " + codePoint); // 输出 97
// int -> char (将码点值转换为字符)
char fromInt = (char) codePoint;
System.out.println("The character for code point 97 is: " + fromInt); // 输出 'a'
// 3. 判断字符类型
char digit = '5';
if (Character.isDigit(digit)) {
System.out.println(digit + " is a digit.");
}
char letter = 'Z';
if (Character.isUpperCase(letter)) {
System.out.println(letter + " is an uppercase letter.");
}
}
}
String - 字符串
String 是 Java 中最常用的类之一,它代表一个不可变的字符序列。
特点:
- 对象/类:
String是一个final类,意味着它不能被继承,它的值在创建后不能被修改。 - 双引号:使用双引号 来表示。
String s = "Hello"; - 不可变性:这是
String最核心的特性,当你对一个String对象进行修改(如拼接、替换)时,并不是在原来的对象上修改,而是创建了一个新的String对象。String s1 = "Hello"; s1 = s1 + " World"; // 这里并没有修改 "Hello",而是创建了一个新的字符串 "Hello World",并将 s1 的引用指向这个新对象。
- 字符串池:为了提高性能和减少内存占用,Java 使用了一个特殊的内存区域叫做“字符串池”,当你使用字面量(如
String s = "abc";)创建字符串时,JVM 会先检查池中是否已存在"abc",如果存在则直接引用,不存在则创建并存入池中。
常用操作:
String 提供了非常丰富的方法来操作字符串。
public class StringExample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
String str3 = "hello"; // 注意大小写
// 1. 拼接
String combined = str1 + " " + str2; // 使用 + 号
System.out.println("Combined: " + combined); // 输出 Combined: Hello World
// 2. 获取长度
System.out.println("Length of str1: " + str1.length()); // 输出 5
// 3. 获取特定位置的字符 (返回 char)
char firstChar = str1.charAt(0);
System.out.println("First character: " + firstChar); // 输出 H
// 4. 子串
String sub = str1.substring(1, 3); // 包含索引1,不包含索引3
System.out.println("Substring: " + sub); // 输出 el
// 5. 大小写转换
System.out.println("Uppercase: " + str1.toUpperCase()); // 输出 HELLO
System.out.println("Lowercase: " + str3.toLowerCase()); // 输出 hello
// 6. 比较
// equals() 区分大小写
System.out.println("str1 equals 'Hello'? " + str1.equals("Hello")); // 输出 true
System.out.println("str1 equals str3? " + str1.equals(str3)); // 输出 false
// equalsIgnoreCase() 不区分大小写
System.out.println("str1 equalsIgnoreCase str3? " + str1.equalsIgnoreCase(str3)); // 输出 true
// 7. 查找
System.out.println("Index of 'o': " + str1.indexOf('o')); // 输出 4
System.out.println("Contains 'ell'? " + str1.contains("ell")); // 输出 true
// 8. 替换
String replaced = str1.replace('l', 'p');
System.out.println("After replace: " + replaced); // 输出 Heppo
}
}
String 与 char[] (字符数组) 的关系
String 内部就是使用一个 char[] 数组来存储字符的,你可以通过 toCharArray() 方法将 String 转换为 char[],也可以通过构造函数 new String(charArray) 将 char[] 转换为 String。

String str = "Java"; // String -> char[] char[] charArray = str.toCharArray(); // charArray 是 ['J', 'a', 'v', 'a'] // char[] -> String String newStr = new String(charArray); // newStr 是 "Java"
StringBuilder 和 StringBuffer(当需要频繁修改字符串时)
由于 String 的不可变性,在循环或需要频繁拼接字符串的场景下,会产生大量临时对象,严重影响性能,这时应该使用 StringBuilder 或 StringBuffer。
StringBuilder:非线程安全,性能更高,在单线程环境下推荐使用。StringBuffer:线程安全,方法大多使用synchronized修饰,性能稍差,在多线程环境下使用。
它们都是可变的,并且提供了 append(), insert(), delete() 等方法来高效地修改字符串内容。
// 高效拼接字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i); // 不会创建新对象,直接在 sb 对象上修改
}
String result = sb.toString(); // 最后再转换成 String
总结与对比
| 特性 | char |
String |
|---|---|---|
| 本质 | 基本数据类型 | 类/对象 |
| 表示 | 单引号 'A' |
双引号 "Hello" |
| 可变性 | 不可变 | 不可变 (核心特性) |
| 内存 | 栈 | 堆 (字符串池优化) |
| 常用场景 | - 表示单个字符(如密码的第一个字符) - 作为数组的元素 - 遍历 String 时得到每个字符 |
- 存储文本信息(如姓名、地址) - 处理文件内容、网络数据 - 字符串的拼接、查找、替换等操作 |
| 性能 | 操作非常快 | 频繁修改时性能差,应使用 StringBuilder/StringBuffer |
如何选择?
- 如果你只想处理一个字符,或者需要一个字符的容器(如
char[]),请使用char。 - 如果你需要处理任何长度的文本,比如一个单词、一句话、一整篇文章,请使用
String。 - 如果你需要在代码中频繁地修改、拼接字符串(例如在循环中),请优先使用
StringBuilder以获得更好的性能。

