🔤 字符串基础
String 是什么 · 最常用方法大表 · == 与 equals · StringBuilder
1. String 是什么?它和基本类型有什么不同?
String = 字符串,是 Java 里最常用的类型。严格说它是"类"(引用类型),但用法像基本类型。
📝 类比:String 就像一个"装字符的盒子",盒子里是一串字符("你好"、"abc123")。
重点:String 内容一旦创建就不能改变(不可变)——你写的 s = s + "!" 其实是创建了一个新字符串,旧的被丢弃。
重点:String 内容一旦创建就不能改变(不可变)——你写的 s = s + "!" 其实是创建了一个新字符串,旧的被丢弃。
字符串创建与拼接
String a = "hello"; // 方式 1:直接量(推荐)
String b = new String("hello"); // 方式 2:new(不推荐,多此一举)
// 拼接:用 + 号(内容少时方便)
String c = "我的名字是" + "小明" + ",今年" + 18 + "岁";
System.out.println(c);
我的名字是小明,今年18岁
// 数字转字符串 / 字符串转数字(常用!)
String num = String.valueOf(100); // "100"
int n = Integer.parseInt("100"); // 100(parseInt 解析失败会报异常)
🎯 记住
- 创建用直接量 "...",别用 new String()(面试点:new 会创建多余对象)
- 频繁拼接(循环里)用 StringBuilder(第 3 节)
- 字符串不可变:所有"修改"方法都是返回新字符串
2. String 最常用的方法(背下来,面试手写全靠它)
| 方法 | 作用 | 例子(s="Hello World") |
|---|---|---|
| s.length() | 长度 | 11 |
| s.charAt(i) | 取第 i 个字符 | s.charAt(0) = 'H' |
| s.substring(a, b) | 截取 [a, b) 区间 | substring(0,5)="Hello" |
| s.equals(t) | 内容相等? | "abc".equals("abc")=true |
| s.contains(t) | 包含子串? | s.contains("World")=true |
| s.startsWith(t) / endsWith | 以…开头/结尾 | s.startsWith("He")=true |
| s.indexOf(t) | 子串位置(没有=-1) | s.indexOf("o")=4 |
| s.replace(a, b) | 替换(返回新的) | s.replace("l","L") |
| s.toUpperCase() / toLowerCase | 大小写 | s.toUpperCase()="HELLO WORLD" |
| s.trim() | 去首尾空格 | " a ".trim()="a" |
| s.split(分隔符) | 按分隔符拆数组 | "a,b,c".split(",") = {a,b,c} |
| s.isEmpty() | 是否空串 | "".isEmpty()=true |
| s.equalsIgnoreCase(t) | 忽略大小写比较 | "ABC".equalsIgnoreCase("abc") |
🎯 最重要的一条
- 比较字符串内容用 equals,绝对不用 ==(== 比较的是引用地址)——最高频面试陷阱
- 全部方法都不改原字符串(不可变),返回新串要接住:s = s.toUpperCase()
3. 什么时候用 StringBuilder?
问题:循环里用 + 拼接,每次都会创建新字符串(旧的变垃圾),循环 10000 次创建 10000 个临时对象——慢且费内存。
循环拼接的正确姿势
// ❌ 慢:每次 + 都建新字符串
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
// ✅ 快:一个可变容器反复 append
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
String result = sb.toString(); // 最后转成 String
🎯 记忆
- 拼接少(≤3 次)→ + 号;拼接多/循环 → StringBuilder
- StringBuilder 可变、快;StringBuffer 加了线程安全但慢(单线程用 StringBuilder)
✍️ 练习题
- 1. 判断 s = "hello" 和 t = "HELLO" 内容是否相等(忽略大小写)
- 2. 从 "2026-08-11" 提取年、月、日(提示:split("-"))
- 3. 统计字符串 "abracadabra" 中字母 'a' 的个数(循环 + charAt)
- 4. 反转字符串 "hello" → "olleh"(提示:从后往前拼,或 StringBuilder.reverse())
- 5. 判断一个字符串是否回文(正读反读一样,如 "abba")
- 6. 陷阱:String a="abc"; String b="abc"; a==b 是 true 还是 false?(答案:字面量相同 → true,见进阶模块常量池;但 new String("abc")==a 是 false)