【大白话说Java面试题】【Java基础篇】第34题:String、StringBuffer和StringBuilder的区别是什么

第34题:String、StringBuffer和StringBuilder的区别是什么

📚 回答:

  • 核心对比 :
    String、StringBuffer 和 StringBuilder 是 Java 中处理字符串的三种主要方式,它们在可变性 、线程安全性 和性能上有显著差异。以下是详细对比:

1. String
  • 定义:

    • String 是一个不可变的字符串对象,一旦创建,其内容无法更改。
    • 每次对字符串进行修改(如拼接)时,都会生成一个新的 String 对象。
  • 底层实现:

    • 底层基于字符数组实现,但由于不可变性,每次修改都会创建新的数组。
  • 优点:

    • 线程安全:因为内容不可变,多线程环境下无需额外同步。
    • 使用简单:适用于大多数场景,尤其是不需要频繁修改字符串的情况。
  • 缺点:

    • 性能较差:频繁修改会导致大量临时对象产生,增加内存开销。

    💡 代码示例 :

    以下代码展示了 String 的不可变性:

java 复制代码
String str = "Hello";
str += " World"; // 创建了一个新的String对象
System.out.println(str); // 输出 "Hello World"

2. StringBuffer
  • 定义:

    • StringBuffer 是一个可变的字符串对象,支持直接修改内容。
    • 底层基于字符数组实现,默认初始容量为 16 字节。
  • 线程安全性:

    • 方法使用 synchronized 关键字修饰,保证线程安全,适合多线程环境。
  • 扩容机制:

    • 当现有容量不足时,会自动扩容为原容量的 2 倍 + 2(即 (oldCapacity * 2) + 2)。
  • 优点:

    • 线程安全:适合多线程场景下的字符串操作。
  • 缺点:

    • 性能较低:由于加锁机制,效率低于 StringBuilder。

    💡 代码示例 :

    以下代码展示了 StringBuffer 的用法:

java 复制代码
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 直接修改原有对象
System.out.println(sb); // 输出 "Hello World"

3. StringBuilder
  • 定义:

    • StringBuilder 是一个可变 的字符串对象,与 StringBuffer 类似,但不保证线程安全。
  • 性能优势:

    • 不使用 synchronized 关键字,因此在单线程环境下性能优于 StringBuffer。
  • 适用场景:

    • 单线程环境下需要频繁修改字符串的场景。

    💡 代码示例 :

    以下代码展示了 StringBuilder 的用法:

java 复制代码
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 直接修改原有对象
System.out.println(sb); // 输出 "Hello World"

4. 对比总结
特性 String StringBuffer StringBuilder
可变性 不可变 可变 可变
线程安全性 线程安全 线程安全 非线程安全
性能 较低(频繁修改时) 较低(加锁开销) 较高(无锁)
适用场景 字符串内容固定或较少修改 多线程环境下的字符串操作 单线程环境下的字符串操作

💡 面试官视角:

  • 面试官可能会问"为什么 String 是不可变的?"
    答:不可变性保证了线程安全,避免多线程环境下数据竞争问题。
  • 面试官可能会追问"StringBuffer 和 StringBuilder 的扩容机制有什么区别?"
    答:两者扩容机制相同,都是 (oldCapacity * 2) + 2,但 StringBuffer 因为加锁,性能略低。

📌 专栏 :大白话说Java面试题 --- 01-Java基础篇

相关推荐
秋天的怀念_David4 分钟前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel11 分钟前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放12 分钟前
Python基础语法练习题(73)
java·前端·python
Wang's Blog16 分钟前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户37215742613541 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
AI入职记1 小时前
AI 代码审查召回率实测:20 个骗过单元测试的变异体,抓到 13 个
后端
浮链序1 小时前
别让 AI 客服把用户当猴耍:百来行 Python 把「转人工」做成一条高可用链路
后端
属于自己的天空1 小时前
Claude Code 插件完全指南:官方市场怎么用,怎么自己写(v2.1.269+)
后端
考研保研资料分享1 小时前
2025公卫保研清华专硕:三校考核、英文读译与择校复盘
面试
Tokenfree1 小时前
给大模型调用加一个熔断器:60 行代码,三个阈值
后端