当前位置: 首页 > news >正文

Java后端面试:核心基础考点,String、StringBuilder、StringBuffer 区别详解

前言

String、StringBuilder、StringBuffer 是Java面试最基础、出场率最高的知识点。大部分面试官都会询问三者区别、底层原理、线程安全以及使用场景。

我整理了一套完整的面试知识点,通俗易懂,适合面试复习,也适合新手巩固Java基础。

一、三者核心区别总结

1.可变性

String:不可变字符串

StringBuilder:可变字符串

StringBuffer:可变字符串

2.线程安全

String:线程安全

StringBuilder:非线程安全

StringBuffer:线程安全

3.性能

String:拼接效率最低

StringBuilder:单线程效率最高

StringBuffer:多线程安全,效率略低

4.适用场景

String:少量字符串定义、静态文本、常量

StringBuilder:单线程环境,大量字符串拼接

StringBuffer:多线程环境,大量字符串拼接

二、底层原理讲解

1.为什么String不可变

String底层使用被final修饰的char数组存储数据,数组一旦初始化完成,无法修改数组地址和内部数据。每次对字符串进行拼接、替换、截取操作,都不会修改原字符串,而是生成一个全新的String对象。

String不可变的优点:

1.可以支持字符串常量池,节省大量内存

2.天然线程安全,多线程共享不会出现数据错乱

3.哈希值固定,非常适合作为HashMap的key

2.StringBuilder和StringBuffer可变原理

两者底层都继承自AbstractStringBuilder,底层使用普通char数组,没有final修饰。拼接字符串时,直接在原数组上修改,不会创建新对象,同时自带数组自动扩容机制,所以拼接性能远高于String。

三、线程安全区别

StringBuffer 的所有 append、修改方法都加入了 synchronized 同步锁,保证多线程并发操作时数据不会丢失、错乱,所以是线程安全的。

StringBuilder 没有任何锁机制,多线程同时拼接字符串会出现覆盖、数据丢失问题,不支持多线程,但是因为没有锁开销,单线程性能最好。

String不可修改,不存在并发修改问题,所以线程安全。

四、开发规范与代码示例

1.不推荐循环内使用String拼接

java
String str = "";
for (int i = 0; i < 1000; i++) {
str += i;
}

循环中使用加号拼接,每一次循环都会创建新的字符串对象,产生大量无效垃圾对象,占用内存,GC频繁,性能极差。

2.单线程推荐使用StringBuilder

java
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
String str = sb.toString();

只会创建一个对象,全程在原数组扩容修改,性能极高,日常开发拼接字符串首选。

3.多线程场景使用StringBuffer

java
StringBuffer sb = new StringBuffer();
new Thread(() -> {
for (int i = 0; i < 500; i++) {
sb.append("a");
}
}).start();

new Thread(() -> {
for (int i = 0; i < 500; i++) {
sb.append("b");
}
}).start();

五、面试高频问答

1. String为什么不可变?

底层是final修饰的字符数组,无法修改原有对象。不可变可以保证常量池复用、线程安全、哈希值稳定。

2. StringBuilder和StringBuffer区别?

StringBuffer方法加锁,线程安全但性能低;StringBuilder无锁,线程不安全但性能高。单线程用StringBuilder,多线程用StringBuffer。

3. 循环拼接字符串用什么?

绝对不要用String加号拼接,循环内统一使用StringBuilder,提升程序性能,减少内存占用。

六、总结

1.简单静态字符串直接使用String。

2.所有循环拼接、大量字符串拼接,优先使用StringBuilder。

3.只有多线程共享拼接对象时,才使用StringBuffer。

http://www.jsqmd.com/news/772989/

相关文章:

  • 别再死记硬背了!用Verilog手把手带你理解CRC校验的电路核心(附串行/并行实现代码)
  • 节后系统恢复中的技术操作:批量处理、数据一致性与人机协作
  • 做了一个 App Store 全球最低价查询工具:支持 App、订阅和内购价格对比
  • 打卡信奥刷题(3225)用C++实现信奥题 P8370 [POI 2001 R3] Goldmine
  • 2026年郑州装修公司推荐排名前十强,口碑好性价比高的靠谱公司盘点 - 速递信息
  • 本土化赋能:Gitee如何重塑中国开发者的代码托管体验
  • Mermaid Live Editor:如何用代码思维解决图表绘制的三大痛点?
  • BDInfo深度解析:蓝光光盘技术规格分析的完整解决方案
  • AISMM×ISO 27001×NIST RMF三模融合实践:一位CISO亲授的72小时风险响应加速方案
  • DayZ社区离线模式终极指南:打造专属末日生存实验室
  • 终极指南:如何用Python快速获取专业级金融数据
  • ChatGPT Atlas全解析:OpenAI原生AI浏览器核心能力+macOS离线安装完整指南
  • 3分钟手机端刷入Android内核:Horizon Kernel Flasher终极指南
  • Python数据分析如何填充缺失日期_Pandas的asfreq技巧
  • mysql数据库读写分离策略与性能分析_通过中间件实现自动路由
  • 每天花两小时刷信息?这个开源项目帮你全自动搞定
  • 如何彻底摆脱Windows浏览器劫持?EdgeDeflector让你的选择权回归
  • 打卡信奥刷题(3226)用C++实现信奥题 P8398 [CCC 2022 S4] Good Triplets
  • 3步实现视频PPT智能提取:extract-video-ppt让课件整理自动化
  • AI模型线上部署的A/B测试设计指南
  • 学之思开源考试系统:3步快速搭建专业在线考试平台的完整指南
  • 基于MCP协议的AI编码助手治理平台:跨模型记忆与自动化API检查
  • 苏州装饰公司哪家靠谱?2026年苏州本地高口碑装修公司推荐排名 - 速递信息
  • 08-MLOps与工程落地——模型注册表与模型服务
  • 如何通过3步解锁QQ群聊天记录的隐藏价值:ChatLog完整指南
  • 重构搜索范式:阿里云 Elasticsearch 开启“Agent 原生”时代,打造企业级 AI 记忆湖
  • 【新人专属】OpenClaw 2.6.6 Windows 11 一键部署完整教程(包含安装包)
  • PySide6实战:手把手教你用SQLite+QTableView打造个人数据管理工具(附源码)
  • 3分钟终极指南:qmcdump轻松解锁QQ音乐加密文件,实现音乐自由播放
  • 5分钟搞定AI文本生成:oobabooga一键安装完全指南