1. Java字符串处理基础
在Java编程中,字符串处理是最基础也是最重要的技能之一。String类作为Java语言中最常用的类,几乎出现在每一个Java程序中。理解String类的特性和使用方法,对于编写高效、健壮的Java代码至关重要。
1.1 String类的基本特性
String类位于java.lang包中,是Java语言的核心类之一。它代表不可变的字符序列,具有以下几个重要特点:
-
不可变性:String对象一旦创建,其内容就不能被修改。任何看似修改字符串的操作,实际上都是创建了一个新的String对象。
-
字符串池:Java使用字符串池来存储字符串字面量,相同的字符串字面量会指向池中的同一个对象,这样可以节省内存空间。
-
底层实现:在JDK8及之前,String内部使用char数组存储字符;从JDK9开始,改为使用byte数组存储,并添加了一个编码标识字段,这样可以更节省内存空间。
java复制// JDK8及以前的String实现
public final class String {
private final char[] value;
}
// JDK9及以后的String实现
public final class String {
private final byte[] value;
private final byte coder; // 编码标识(0表示LATIN1,1表示UTF16)
}
1.2 字符串的创建方式
Java中创建字符串主要有两种方式:
- 直接赋值:使用双引号创建字符串字面量,这种方式创建的字符串会被放入字符串池中。
java复制String s1 = "Hello"; // 字符串字面量,存储在字符串池中
String s2 = "Hello"; // 会复用字符串池中的"Hello"
System.out.println(s1 == s2); // true,因为指向同一个对象
- 使用new关键字:通过构造函数创建String对象,这种方式每次都会在堆内存中创建一个新的String对象。
java复制String s3 = new String("Hello"); // 在堆中创建新对象
String s4 = new String("Hello"); // 再次创建新对象
System.out.println(s3 == s4); // false,两个不同的对象
最佳实践:在大多数情况下,推荐使用直接赋值的方式创建字符串,因为它可以利用字符串池的特性,节省内存空间。只有在需要将字符数组或字节数组转换为字符串时,才需要使用new关键字。
1.3 字符串的内存分析
理解字符串在内存中的存储方式对于编写高效代码非常重要。下面是一个内存分析的示例:
java复制String s1 = "Hello"; // 字符串池
String s2 = "Hello"; // 复用字符串池中的"Hello"
String s3 = new String("Hello"); // 堆内存中的新对象
String s4 = s3.intern(); // 返回字符串池中的"Hello"
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s1 == s4); // true
内存结构示意图:
code复制字符串池
┌──────────────┐
│ "Hello" │ ← s1, s2, s4
│ [0x100] │
└──────────────┘
↑
│
s3 → ┌─────────────┐
│ String对象 │
│ value→0x100 │
└─────────────┘
intern()方法可以将字符串对象添加到字符串池中(如果池中还没有该字符串),并返回池中的引用。这是一个非常有用的方法,特别是在处理大量可能重复的字符串时。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字符串的比较操作
字符串比较是编程中最常见的操作之一,但也是最容易出错的地方之一。理解各种比较方式的区别对于编写正确的代码至关重要。
2.1 ==与equals的区别
- ==操作符:比较的是两个对象的引用(内存地址)是否相同。
java复制String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true,指向字符串池中的同一个对象
System.out.println(s1 == s3); // false,s3是堆中的新对象
- equals方法:比较的是两个字符串的内容是否相同。
java复制System.out.println(s1.equals(s2)); // true,内容相同
System.out.println(s1.equals(s3)); // true,内容相同
常见错误:初学者经常错误地使用==来比较字符串内容,这会导致逻辑错误。记住,比较字符串内容时总是使用equals方法。
2.2 equals方法的正确使用
equals方法虽然简单,但在使用时也有一些需要注意的地方:
java复制String str = null;
// 错误写法:可能抛出NullPointerException
if (str.equals("Hello")) {
// ...
}
// 正确写法1:把已知字符串放在前面
if ("Hello".equals(str)) {
// ...
}
// 正确写法2:使用Objects.equals(JDK7+)
if (Objects.equals(str, "Hello")) {
// ...
}
2.3 忽略大小写的比较
在某些场景下,我们需要忽略大小写来比较字符串,这时可以使用equalsIgnoreCase方法:
java复制String s1 = "Hello";
String s2 = "hello";
System.out.println(s1.equals(s2)); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true
2.4 compareTo方法
compareTo方法用于按字典顺序比较两个字符串,返回一个整数表示比较结果:
- 返回0表示两个字符串相等
- 返回负数表示当前字符串在字典顺序中位于参数字符串之前
- 返回正数表示当前字符串在字典顺序中位于参数字符串之后
java复制System.out.println("apple".compareTo("banana")); // 负数('a'<'b')
System.out.println("apple".compareTo("apple")); // 0
System.out.println("banana".compareTo("apple")); // 正数('b'>'a')
这个方法在排序字符串集合时非常有用。
3. 字符串的常用操作方法
String类提供了丰富的方法来操作字符串,掌握这些方
