一句话总结

  • 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 编程。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐