1. String 是什么?它和基本类型有什么不同?

String = 字符串,是 Java 里最常用的类型。严格说它是"类"(引用类型),但用法像基本类型。

📝 类比:String 就像一个"装字符的盒子",盒子里是一串字符("你好"、"abc123")。
重点: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)

✍️ 练习题

⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。