Java 字符与字符串
文本处理是编程中的一项常见任务。Java 提供了 char 基本类型来表示单个字符,以及一个功能非常强大的 String 类来处理字符序列。
char 类型
char 类型用于存储单个 16 位的 Unicode 字符。它的值必须用单引号 (') 括起来。
char myInitial = 'C';
char copyrightSymbol = '©';
char chineseChar = '好';
// 也可以使用 Unicode 值来表示字符
char unicodeChar = '\u0041'; // 代表 'A'
System.out.println("我的首字母: " + myInitial);
System.out.println("Unicode 字符: " + unicodeChar);String 类
String 是一个引用类型,用于表示一系列字符。它是 Java 中最常用、最重要的类之一。
创建字符串
创建字符串最简单的方式是使用双引号 (")。
// 直接使用字面量创建
String greeting = "Hello, World!";
// 使用 new 关键字创建 String 对象
String name = new String("Java");字符串的不可变性 (Immutability)
这是 String 类最重要的特性:一旦一个 String 对象被创建,它的值就不能被改变。
当您对一个字符串进行“修改”(如拼接、替换)时,Java 实际上是创建了一个新的 String 对象,而不是在原地修改原始对象。
String s = "Hello";
s = s.concat(", Java!"); // concat 方法返回一个新的字符串对象
System.out.println(s); // 输出 "Hello, Java!"
// 原始的 "Hello" 字符串对象仍然存在于内存中,只是 s 变量不再引用它这种设计使得字符串在多线程环境中是线程安全的,并且可以被安全地用作哈希表的键。
常用 String 方法
String 类提供了大量用于操作字符串的有用方法。以下是一些最常见的:
length(): 返回字符串的长度(字符数)。javaString str = "Java"; System.out.println(str.length()); // 4charAt(int index): 返回指定索引位置的char字符。索引从 0 开始。javaString str = "Java"; System.out.println(str.charAt(0)); // 'J'concat(String str): 将指定字符串连接到此字符串的末尾。等同于+操作符。javaString s1 = "Hello, "; String s2 = "World"; System.out.println(s1.concat(s2)); // "Hello, World"equals(Object anObject): 比较两个字符串的内容是否完全相同(区分大小写)。equalsIgnoreCase(String anotherString): 比较两个字符串的内容是否相同(不区分大小写)。javaString s1 = "java"; String s2 = "Java"; System.out.println(s1.equals(s2)); // false System.out.println(s1.equalsIgnoreCase(s2)); // truesubstring(int beginIndex, int endIndex): 返回一个新的字符串,它是此字符串的一个子字符串。包含beginIndex,不包含endIndex。javaString str = "HelloWorld"; System.out.println(str.substring(0, 5)); // "Hello"indexOf(String str): 返回指定子字符串在此字符串中第一次出现的索引。如果未找到,则返回 -1。javaString str = "Hello World"; System.out.println(str.indexOf("World")); // 6toUpperCase()/toLowerCase(): 返回一个新的字符串,其中所有字符都转换为大写或小写。trim(): 返回一个新的字符串,移除了原始字符串两端的空白字符。replace(char oldChar, char newChar): 返回一个新的字符串,其中所有的oldChar都被newChar替换。split(String regex): 根据给定的正则表达式拆分此字符串,返回一个字符串数组。javaString data = "apple,banana,orange"; String[] fruits = data.split(","); for (String fruit : fruits) { System.out.println(fruit); }startsWith(String prefix)/endsWith(String suffix): 测试此字符串是否以指定的前缀开始或后缀结束。isEmpty(): 判断字符串长度是否为 0。从 Java 6 开始提供。isBlank(): 判断字符串是否为空白(长度为 0 或只包含空白字符)。从 Java 11 开始提供。
StringBuilder 和 StringBuffer
由于 String 是不可变的,当需要频繁地修改字符串内容时(例如,在循环中拼接大量字符串),使用 String 会产生大量不必要的中间对象,效率低下。
为了解决这个问题,Java 提供了两个可变的字符串类:
StringBuilder: 非线程安全,但效率更高。是单线程环境下进行字符串修改的首选。StringBuffer: 线程安全,但效率稍低。适用于多线程环境。
它们提供了 append(), insert(), delete(), replace() 等方法来直接修改字符串内容,而不会每次都创建新对象。
// 高效的字符串拼接
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(", ");
sb.append("World!");
String result = sb.toString(); // 最后再转换为 String 对象
System.out.println(result);