1. String类的基本概念与特性
String是Java中最基础也最常用的类之一,它代表不可变的字符序列。在Java中,String不是基本数据类型,而是一个真正的类,位于java.lang包中,因此无需显式导入即可使用。
1.1 String的不可变性
String对象一旦创建,其内容就不可更改。这个特性看似简单,却影响着String的方方面面:
java复制String s = "hello";
s = s + " world"; // 实际上创建了新的String对象
这段代码中,第二行并不是修改了原有的"hello"字符串,而是创建了一个全新的String对象。这种不可变性带来了几个重要影响:
- 线程安全:由于不可变,String对象可以被多个线程安全共享
- 缓存哈希值:String的hashCode()方法会缓存计算结果,提高作为HashMap键的性能
- 安全性:常用于网络连接、文件路径等场景,避免被意外修改
1.2 String的创建方式
Java中创建String对象主要有两种方式:
- 字面量方式:
java复制String s1 = "hello"; // 存储在字符串常量池
- new关键字方式:
java复制String s2 = new String("hello"); // 强制在堆中创建新对象
这两种方式在内存分配上有本质区别。字面量方式会先检查字符串常量池,如果存在则直接引用,不存在则创建并放入池中;而new方式则直接在堆中创建新对象,无论常量池中是否存在。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. String类的内存机制
2.1 字符串常量池
JVM为了优化字符串存储,设计了字符串常量池(String Pool),它是方法区的一部分。当使用字面量创建字符串时,JVM会先检查常量池:
java复制String a = "hello";
String b = "hello";
System.out.println(a == b); // true,指向同一对象
这种机制可以节省大量内存空间,特别是对于重复出现的字符串。
2.2 intern()方法
String的intern()方法可以将字符串对象主动放入常量池:
java复制String s1 = new String("hello");
String s2 = s1.intern();
System.out.println(s1 == s2); // false
System.out.println(s2 == "hello"); // true
这个方法在需要大量重复字符串的场景下非常有用,可以显著减少内存占用。
3. String类的常用方法
3.1 字符串操作
String类提供了丰富的方法来操作字符串:
- 长度和判空:
java复制String s = "hello";
int len = s.length(); // 5
boolean empty = s.isEmpty(); // false
- 获取字符:
java复制char c = s.charAt(1); // 'e'
- 比较:
java复制boolean eq = s.equals("hello"); // true
int cmp = s.compareTo("world"); // 负数,表示字典序在前
- 查找:
java复制int index = s.indexOf('l'); // 2
int lastIndex = s.lastIndexOf('l'); // 3
3.2 字符串转换
- 大小写转换:
java复制String upper = s.toUpperCase(); // "HELLO"
String lower = "WORLD".toLowerCase(); // "world"
- 去除空白:
java复制String trimmed = " hello ".trim(); // "hello"
- 替换:
java复制String replaced = s.replace('l', 'L'); // "heLLo"
- 分割:
java复制String[] parts = "a,b,c".split(","); // ["a", "b", "c"]
3.3 格式化与连接
- 格式化:
java复制String formatted = String.format("Hi, %s! You have %d messages.", "Alice", 5);
- 连接:
java复制String joined = Stri
