杰瑞科技汇

String与Char有何本质区别?

核心区别(一句话总结)

  • char单个字符,它是 Java 的基本数据类型,用单引号 表示。'A', '中', '1'
  • String字符串,它是 Java 的类(对象),用双引号 表示,它是一个由零个或多个 char 组成的字符序列。"Hello", "Java"

char - 字符

char 是 Character 类型的简写,它是一个 16 位的无符号基本数据类型,用于表示一个 Unicode 字符。

String与Char有何本质区别?-图1
(图片来源网络,侵删)

特点:

  1. 基本数据类型:不是对象,存储在栈中,效率更高。
  2. 单引号:使用单引号 来表示。char c = 'A';
  3. Unicode 字符:可以表示任何 Unicode 字符,包括英文字母、数字、汉字、特殊符号等。
    char letter = 'A';
    char digit = '9';
    char chineseChar = '中';
    char symbol = '@';
  4. 转义字符:可以使用转义字符来表示一些特殊字符。
    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 中最常用的类之一,它代表一个不可变的字符序列。

特点:

  1. 对象/类String 是一个 final 类,意味着它不能被继承,它的值在创建后不能被修改
  2. 双引号:使用双引号 来表示。String s = "Hello";
  3. 不可变性:这是 String 最核心的特性,当你对一个 String 对象进行修改(如拼接、替换)时,并不是在原来的对象上修改,而是创建了一个新的 String 对象。
    String s1 = "Hello";
    s1 = s1 + " World"; // 这里并没有修改 "Hello",而是创建了一个新的字符串 "Hello World",并将 s1 的引用指向这个新对象。
  4. 字符串池:为了提高性能和减少内存占用,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
    }
}

Stringchar[] (字符数组) 的关系

String 内部就是使用一个 char[] 数组来存储字符的,你可以通过 toCharArray() 方法将 String 转换为 char[],也可以通过构造函数 new String(charArray)char[] 转换为 String

String与Char有何本质区别?-图2
(图片来源网络,侵删)
String str = "Java";
// String -> char[]
char[] charArray = str.toCharArray(); // charArray 是 ['J', 'a', 'v', 'a']
// char[] -> String
String newStr = new String(charArray); // newStr 是 "Java"

StringBuilderStringBuffer(当需要频繁修改字符串时)

由于 String 的不可变性,在循环或需要频繁拼接字符串的场景下,会产生大量临时对象,严重影响性能,这时应该使用 StringBuilderStringBuffer

  • 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 以获得更好的性能。
String与Char有何本质区别?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇