Skip to content

Java 字符与字符串

文本处理是编程中的一项常见任务。Java 提供了 char 基本类型来表示单个字符,以及一个功能非常强大的 String 类来处理字符序列。

char 类型

char 类型用于存储单个 16 位的 Unicode 字符。它的值必须用单引号 (') 括起来。

java
char myInitial = 'C';
char copyrightSymbol = '©';
char chineseChar = '好';

// 也可以使用 Unicode 值来表示字符
char unicodeChar = '\u0041'; // 代表 'A'

System.out.println("我的首字母: " + myInitial);
System.out.println("Unicode 字符: " + unicodeChar);

String

String 是一个引用类型,用于表示一系列字符。它是 Java 中最常用、最重要的类之一。

创建字符串

创建字符串最简单的方式是使用双引号 (")。

java
// 直接使用字面量创建
String greeting = "Hello, World!";

// 使用 new 关键字创建 String 对象
String name = new String("Java");

字符串的不可变性 (Immutability)

这是 String 类最重要的特性:一旦一个 String 对象被创建,它的值就不能被改变

当您对一个字符串进行“修改”(如拼接、替换)时,Java 实际上是创建了一个新的 String 对象,而不是在原地修改原始对象。

java
String s = "Hello";
s = s.concat(", Java!"); // concat 方法返回一个新的字符串对象

System.out.println(s); // 输出 "Hello, Java!"
// 原始的 "Hello" 字符串对象仍然存在于内存中,只是 s 变量不再引用它

这种设计使得字符串在多线程环境中是线程安全的,并且可以被安全地用作哈希表的键。

常用 String 方法

String 类提供了大量用于操作字符串的有用方法。以下是一些最常见的:

  • length(): 返回字符串的长度(字符数)。

    java
    String str = "Java";
    System.out.println(str.length()); // 4
  • charAt(int index): 返回指定索引位置的 char 字符。索引从 0 开始。

    java
    String str = "Java";
    System.out.println(str.charAt(0)); // 'J'
  • concat(String str): 将指定字符串连接到此字符串的末尾。等同于 + 操作符。

    java
    String s1 = "Hello, ";
    String s2 = "World";
    System.out.println(s1.concat(s2)); // "Hello, World"
  • equals(Object anObject): 比较两个字符串的内容是否完全相同(区分大小写)。

  • equalsIgnoreCase(String anotherString): 比较两个字符串的内容是否相同(不区分大小写)。

    java
    String s1 = "java";
    String s2 = "Java";
    System.out.println(s1.equals(s2)); // false
    System.out.println(s1.equalsIgnoreCase(s2)); // true
  • substring(int beginIndex, int endIndex): 返回一个新的字符串,它是此字符串的一个子字符串。包含 beginIndex,不包含 endIndex

    java
    String str = "HelloWorld";
    System.out.println(str.substring(0, 5)); // "Hello"
  • indexOf(String str): 返回指定子字符串在此字符串中第一次出现的索引。如果未找到,则返回 -1。

    java
    String str = "Hello World";
    System.out.println(str.indexOf("World")); // 6
  • toUpperCase() / toLowerCase(): 返回一个新的字符串,其中所有字符都转换为大写或小写。

  • trim(): 返回一个新的字符串,移除了原始字符串两端的空白字符。

  • replace(char oldChar, char newChar): 返回一个新的字符串,其中所有的 oldChar 都被 newChar 替换。

  • split(String regex): 根据给定的正则表达式拆分此字符串,返回一个字符串数组。

    java
    String 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 开始提供。

StringBuilderStringBuffer

由于 String 是不可变的,当需要频繁地修改字符串内容时(例如,在循环中拼接大量字符串),使用 String 会产生大量不必要的中间对象,效率低下。

为了解决这个问题,Java 提供了两个可变的字符串类:

  • StringBuilder: 非线程安全,但效率更高。是单线程环境下进行字符串修改的首选。
  • StringBuffer: 线程安全,但效率稍低。适用于多线程环境。

它们提供了 append(), insert(), delete(), replace() 等方法来直接修改字符串内容,而不会每次都创建新对象。

java
// 高效的字符串拼接
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(", ");
sb.append("World!");

String result = sb.toString(); // 最后再转换为 String 对象
System.out.println(result);

本站内容仅供学习和研究使用。