Java八股:String、StringBuffer、StringBuilder的区别和联系,Lambda 表达式
一句话总结
- String:不可变,线程安全,适合少量字符串操作
- StringBuffer:可变,线程安全,性能一般
- StringBuilder:可变,非线程安全,性能最好(最常用)
表格区分
| 对比点 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 是否可变 | ❌ 不可变 | ✅ 可变 | ✅ 可变 |
| 线程安全 | ✅ 安全 | ✅ 安全(方法加 synchronized) | ❌ 不安全 |
| 性能 | ❌ 最低 | ⚠️ 中等 | ✅ 最高 |
| 常见使用场景 | 常量、少量拼接 | 多线程字符串操作 | 单线程大量拼接 |
什么叫「不可变」?
String s = "abc";
s = s + "def";
“abc” 在内存中,“def” 在内存中,新建一个 “abcdef”,s 指向新的字符串
原来的 “abc” 没有被修改,导致每次修改String,都会创建新对象→ 性能差 + 内存浪费
StringBuffer / StringBuilder 为什么快?
StringBuilder sb = new StringBuilder("abc");
sb.append("def");
sb.append("ghi");
- 底层是 char[] 数组
- append 是在原数组上修改
- 不创建新对象(除非扩容)
StringBuffer vs StringBuilder
最大区别
线程安全性
- StringBuffer:方法加了 synchronized
- StringBuilder:没加锁
public synchronized StringBuffer append(String str) { ... }
📌 结果:
StringBuffer:安全,但慢
StringBuilder:不安全,但快
在单线程环境下,优先使用 StringBuilder,因为性能更高;
在多线程环境下,如果需要保证线程安全,可以使用 StringBuffer。
String、StringBuffer、StringBuilder的使用情况
- String
字符串常量
很少修改
配置项、方法参数、返回值
String name = "Tom";
- StringBuilder
for 循环拼接
算法题
日常开发 90% 场景
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
- StringBuffer
多线程共享字符串
对性能要求不高,但要求安全
Lambda 表达式
Lambda 表达式 = 用更短的方式,写“只有一个方法的接口”的实现
Lambda 表达式它是一种简洁的语法,用于创建匿名函数,主要用于简化函数式接口(只有一个抽象方法的接口)的使用。其基本语法有以下两种形式:
(parameters) -> expression:当 Lambda 体只有一个表达式时使用,表达式的结果会作为返回值。
(parameters) -> { statements; }:当 Lambda 体包含多条语句时,需要使用大括号将语句括起来,若有返回值则需要使用 return 语句。
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
等价于
Runnable r = () -> {
System.out.println("hello");
};
Lambda 的标准语法
(参数列表) -> { 方法体 }
无参数
() -> System.out.println(“hello”)
一个参数
x -> x * x
多个参数
(a, b) -> a + b
Lambda 和匿名内部类的区别
| 对比点 | Lambda | 匿名内部类 |
|---|---|---|
| 代码量 | 少 | 多 |
| 可读性 | 高 | 低 |
| this 指向 | 外部类 | 自己 |
| 适用范围 | 函数式接口 | 任意接口 |
总结
Lambda 表达式是 Java 8 引入的一种简化写法,用来替代函数式接口的匿名内部类,本质是把“实现方法”当成参数传递,让代码更简洁、可读性更高,常用于集合操作、排序、回调和 Stream 编程。
更多推荐




所有评论(0)