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

Java 中的 String、StringBuffer 与 StringBuilder:区别、联系与实战选型

String、StringBuffer、StringBuilder 是 Java 中处理字符串的核心类三者都用于字符串操作但在可变性、线程安全、性能上差异显著。本文从「核心特性→底层原理→性能对比→实战选型」全维度拆解帮你精准掌握三者的使用场景。一、核心特性对比必记先通过表格快速掌握三者核心差异这是选型的关键表格特性StringStringBufferStringBuilder可变性不可变final 类字符数组私有且 final可变字符数组可扩容修改可变同 StringBuffer线程安全线程安全不可变天然安全线程安全方法加 synchronized非线程安全无同步锁底层实现char[]JDK8/ byte[]JDK9char[]JDK8/ byte[]JDK9char[]JDK8/ byte[]JDK9初始容量无字符串字面量直接创建默认 16可指定初始容量默认 16可指定初始容量扩容机制无每次拼接新建对象扩容为原容量 ×22复制数组同 StringBuffer性能拼接操作性能极差频繁新建对象拼接性能中等同步开销拼接性能最优无同步开销适用场景字符串不修改、少量拼接多线程环境下频繁修改字符串单线程环境下频繁修改字符串二、底层原理深度解析1. String不可变的字符串1不可变性的底层实现String 被设计为不可变类Immutable核心原因类被final修饰无法被继承存储字符的数组JDK8private final char value[]JDK9private final byte[] value被final private修饰引用不可变且无对外修改的方法所有拼接、替换等操作都会新建 String 对象原对象不会被修改。2字符串拼接的性能问题java运行// 看似简单的拼接底层会频繁新建对象 String s a; s b; s c;底层等价代码编译后java运行String s a; s new StringBuilder(s).append(b).toString(); s new StringBuilder(s).append(c).toString();每一次都会新建StringBuilder和String对象频繁拼接时产生大量临时对象触发 GC性能极差。3字符串常量池String PoolString 的不可变性支撑了字符串常量池JVM 堆中的一块区域避免重复创建相同字符串字面量创建String s abc先检查常量池有则复用无则创建new 创建String s new String(abc)先在常量池创建 abc再在堆中创建新对象慎用示例验证java运行String s1 abc; String s2 abc; String s3 new String(abc); System.out.println(s1 s2); // true常量池复用 System.out.println(s1 s3); // false堆中不同对象 System.out.println(s1.equals(s3)); // true内容相等2. StringBuffer线程安全的可变字符串1线程安全的实现StringBuffer 的所有修改方法append()/insert()/replace()等都被synchronized修饰保证多线程下操作安全java运行// StringBuffer 核心方法源码JDK8 Override public synchronized StringBuffer append(String str) { toStringCache null; super.append(str); return this; }2扩容机制StringBuffer 底层是可变字符数组默认初始容量 16当拼接的字符超过当前容量时触发扩容新容量 原容量 × 2 2扩容时会复制原数组到新数组产生性能开销提前指定初始容量可优化。3. StringBuilder高性能的可变字符串1与 StringBuffer 的关系StringBuilder 是 JDK5 引入的「非线程安全版 StringBuffer」底层实现、扩容机制与 StringBuffer 完全一致唯一区别是去掉了synchronized修饰因此性能更高。2性能优势的本质无同步锁的开销单线程下拼接操作的效率比 StringBuffer 高 10~20 倍高频拼接场景差距更明显。三、核心用法示例1. String 基础用法java运行// 1. 字面量创建推荐 String s1 Hello; // 2. new 创建不推荐浪费内存 String s2 new String(World); // 3. 少量拼接无性能问题 String s3 s1 s2; // 4. 常用方法 System.out.println(s1.length()); // 5长度 System.out.println(s1.charAt(0)); // H获取字符 System.out.println(s1.equalsIgnoreCase(hello)); // true忽略大小写比较 System.out.println(s1.substring(1, 3)); // el子串 System.out.println(s1.replace(e, E)); // HEllo替换返回新对象2. StringBuffer 用法多线程场景java运行// 1. 指定初始容量优化扩容 StringBuffer sb new StringBuffer(100); // 2. 拼接操作线程安全 sb.append(Java); sb.append( ).append(StringBuffer); sb.insert(4, SE ); // 在索引4插入 // 3. 转 String String result sb.toString(); System.out.println(result); // JavaSE StringBuffer3. StringBuilder 用法单线程场景java运行// 1. 高频拼接性能最优 StringBuilder sb new StringBuilder(); for (int i 0; i 1000; i) { sb.append(i); // 无临时对象性能远高于 String } String result sb.toString(); System.out.println(result); // 0123...999四、性能对比测试通过代码验证三者在高频拼接场景下的性能差异java运行public class StringPerformanceTest { public static void main(String[] args) { int times 100000; // 拼接次数 // 1. String 拼接性能最差 long start1 System.currentTimeMillis(); String s ; for (int i 0; i times; i) { s i; } long end1 System.currentTimeMillis(); System.out.println(String 耗时 (end1 - start1) ms); // 2. StringBuffer 拼接性能中等 long start2 System.currentTimeMillis(); StringBuffer sb1 new StringBuffer(); for (int i 0; i times; i) { sb1.append(i); } long end2 System.currentTimeMillis(); System.out.println(StringBuffer 耗时 (end2 - start2) ms); // 3. StringBuilder 拼接性能最优 long start3 System.currentTimeMillis(); StringBuilder sb2 new StringBuilder(); for (int i 0; i times; i) { sb2.append(i); } long end3 System.currentTimeMillis(); System.out.println(StringBuilder 耗时 (end3 - start3) ms); } }测试结果参考plaintextString 耗时8920ms StringBuffer 耗时5ms StringBuilder 耗时2ms结论高频拼接场景下String 性能极差StringBuilder 比 StringBuffer 快约 2 倍。五、实战选型指南核心1. 选 String 的场景字符串内容不修改如常量定义、参数传递、返回值少量拼接如 2~3 次操作需利用字符串常量池复用字面量创建。2. 选 StringBuffer 的场景多线程环境下需要频繁修改字符串如多线程日志拼接、多线程数据拼接要求线程安全可接受同步锁的性能开销。3. 选 StringBuilder 的场景单线程环境下频繁修改字符串如循环拼接、动态生成 SQL、JSON 字符串追求极致性能无线程安全要求90% 的业务场景首选。4. 通用优化技巧可变字符串StringBuffer/StringBuilder尽量指定初始容量避免频繁扩容避免在循环中使用String 优先用 StringBuilder字符串比较优先用equals()而非比较引用equals比较内容JDK9 中String 底层改为 byte 数组存储单字节字符如 ASCII时更节省内存。六、常见面试题String 为什么是不可变的类被 final 修饰存储字符的数组被 final private 修饰无修改数组的方法所有操作都新建对象。String、StringBuffer、StringBuilder 的核心区别String 不可变、线程安全、性能差StringBuffer 可变、线程安全synchronized、性能中等StringBuilder 可变、非线程安全、性能最优。为什么 StringBuilder 比 String 快String 拼接新建对象StringBuilder 直接修改底层数组无临时对象和 GC 开销。StringBuffer 的扩容机制默认初始容量 16扩容为原容量 ×22扩容时复制数组。String s new String (abc) 创建了几个对象常量池无 abc 时创建 2 个常量池 1 个堆 1 个常量池已有 abc 时创建 1 个堆中对象。总结核心差异String 不可变、性能差StringBuffer 可变、线程安全、性能中等StringBuilder 可变、非线程安全、性能最优选型原则无修改选 String单线程高频修改选 StringBuilder多线程修改选 StringBuffer性能优化可变字符串指定初始容量避免循环中 String 操作。

相关文章:

Java 中的 String、StringBuffer 与 StringBuilder:区别、联系与实战选型

String、StringBuffer、StringBuilder 是 Java 中处理字符串的核心类,三者都用于字符串操作,但在可变性、线程安全、性能上差异显著。本文从「核心特性→底层原理→性能对比→实战选型」全维度拆解,帮你精准掌握三者的使用场景。一、核心特性…...

万界星空奶油制造工厂MES系统完整解决方案

——覆盖原材料、全链路追溯、不合格品闭环、成本能效与智能合规的一体化乳品智造平台 一、行业背景与挑战奶油(稀奶油、黄油、无水奶油等)作为高敏感度乳制品,具有原料易变质、工艺复杂、保质期短(2–30天)、微生物风…...

Ubuntu 22.04上安装Isaac Gym避坑全记录:从Vulkan报错到Segmentation Fault解决

Ubuntu 22.04上安装Isaac Gym避坑全记录:从Vulkan报错到Segmentation Fault解决 Isaac Gym作为NVIDIA推出的物理仿真平台,在机器人强化学习领域展现出强大的性能优势。然而在Ubuntu 22.04系统上的安装过程却可能成为开发者的"噩梦"——从Vulka…...

2024最新版:Java集成微信支付APIV3保姆级教程(含完整代码)

2024年Java集成微信支付APIV3全流程实战指南 微信支付作为国内移动支付领域的核心基础设施,其APIV3版本在安全性、易用性和功能性上都实现了显著提升。本文将带您从零开始,全面掌握Java环境下微信支付APIV3的集成方法,包含最新技术要点和实战…...

OpenClaw极简部署:Qwen3.5-9B镜像10分钟快速体验指南

OpenClaw极简部署:Qwen3.5-9B镜像10分钟快速体验指南 1. 为什么选择云端快速体验? 作为长期关注AI自动化工具的技术从业者,我一直在寻找既能快速验证想法又无需复杂环境配置的方案。OpenClaw的本地部署虽然强大,但对于只是想初步…...

300W 24V转24V 隔离防水DC-DC电源在铁路轨道交通中的应用方案

随着铁路轨道交通、城市轨道列车和高铁系统的智能化发展,车载电子设备数量不断增加,对电源系统的稳定性、安全性、抗干扰能力和环境适应性提出了更高要求。列车控制管理系统(TCMS)、乘客信息系统(PIS)、车载…...

立知模型性能优化指南:GPU加速与批量处理技巧

立知模型性能优化指南:GPU加速与批量处理技巧 1. 这不是调参,是让模型真正跑起来 你刚部署好 lychee-rerank-mm,输入一张图加几句话,等了七八秒才出分——这感觉熟悉吗?别急着怀疑模型能力,问题大概率不在…...

Lingbot-Depth-Pretrain-Vit-VitL-14模型部署避坑指南:常见错误403 Forbidden等排查

Lingbot-Depth-Pretrain-Vit-VitL-14模型部署避坑指南:常见错误403 Forbidden等排查 最近在帮几个朋友部署Lingbot-Depth-Pretrain-VitL-14这个深度估计模型时,发现大家踩的坑都差不多。尤其是那个让人头疼的“403 Forbidden”错误,还有各种…...

微信更新后记录没了?试试这几个方法

引言:数据丢失的焦虑你是否经历过这样的场景:微信更新后,打开聊天记录发现重要的对话信息莫名其妙消失了?工作文件、珍贵回忆、重要信息...这些数据一旦丢失,可能会带来巨大的麻烦和焦虑。据统计,2025年手机…...

绕过DVWA文件上传限制的5种骚操作(含BurpSuite截断技巧)

DVWA文件上传漏洞的5种高阶绕过手法实战解析 在渗透测试的实战环境中,文件上传漏洞往往是最具破坏力的攻击入口之一。DVWA(Damn Vulnerable Web Application)作为经典的漏洞演练平台,其文件上传模块设置了从低到高的安全级别&…...

AudioLDM-S小白教程:从部署到生成,完整流程打造你的第一个AI音效

AudioLDM-S小白教程:从部署到生成,完整流程打造你的第一个AI音效 1. 引言:AI音效生成新体验 你是否遇到过这样的场景:制作短视频时找不到合适的背景音效,游戏开发时需要大量环境声效资源,或者想为播客添加…...

AI浪潮下,HTML开发者该筑牢哪些核心知识壁垒?

一、前言:AI不是替代者,而是「放大镜」 随着ChatGPT、Copilot、Cursor等AI工具的普及,很多HTML开发者产生了焦虑:「AI能一键生成HTML代码,我们还需要深耕基础吗?」 答案是肯定的。AI确实能高效产出基础代码…...

Tao-8k处理时序数据实战:LSTM模型原理与融合应用

Tao-8k处理时序数据实战:LSTM模型原理与融合应用 最近在做一个销量预测的项目,团队里的小伙伴们一直在争论:到底是直接用传统的时序模型,还是试试现在流行的语言大模型?其实,这两者并不矛盾。传统的LSTM&a…...

Faiss GPU版安装避坑指南:解决CUBLAS_STATUS_SUCCESS报错(附CUDA版本选择)

Faiss GPU版实战指南:从CUDA版本匹配到性能调优全解析 遇到CUBLAS_STATUS_SUCCESS报错时,很多开发者第一反应是检查代码逻辑,但问题往往出在更基础的环节——环境配置。Faiss作为Meta开源的向量相似度搜索库,其GPU版本对CUDA环境有…...

SRIO的port_initialized和link_initialized

一、link说明 1.port_initialized port_initial信号已置高,表明物理层端口; 如果port_initial拉不高,就要检查时钟和复位信号了; 看看时钟频率是否是对的,复位是否满足复位时序。2.link_initialized link_initialized信号拉高&…...

ACSL-7210-06RE,双通道(双向)高速CMOS光耦合器

型号介绍今天我要向大家介绍的是 Broadcom 的耦合器——ACSL-7210-06RE。它的每个通道都包含一个 CMOS LED 驱动器和一个高速 LED,以及一个 CMOS 检测器。这种构造使得它的反应极其迅速,传播延迟时间最快可达 27 纳秒左右,最大不超过 40 纳秒…...

玩转含风光储并网的IEEE33节点配电系统Simulink模型

含风光储并网的IEEE33节点配电系统simulink模型,当风光容量较多时将呢能量储存,风光容量不足负载供电时储能放电,风光储能另配备简单的电流保护,在系统发生故障时可切除并网部分。在当今追求清洁能源的时代,含风光储并…...

凡是能被摄像机捕捉的,AI就能学会生成;凡是能被屏幕呈现的,就难以避免被复制

引言:一句话的重量 “凡是能被摄像机捕捉的,AI就能学会生成;凡是能被屏幕呈现的,就难以避免被复制。” 这句话初读像是一个关于技术能力的陈述,但细想之下,它触碰的远不止技术边界。它在说:人类…...

零基础玩转Qwen2.5-7B-Instruct:5分钟搞定vLLM离线推理与前端调用

零基础玩转Qwen2.5-7B-Instruct:5分钟搞定vLLM离线推理与前端调用 1. 快速了解Qwen2.5-7B-Instruct Qwen2.5-7B-Instruct是通义千问团队最新推出的70亿参数指令微调语言模型。相比前代产品,它在多个方面有显著提升: 知识量大幅增加&#x…...

AI头像生成器与Stable Diffusion搭配使用:完整头像制作流程

AI头像生成器与Stable Diffusion搭配使用:完整头像制作流程 1. 为什么需要AI头像生成器? 在数字时代,头像已经成为我们在线身份的重要组成部分。无论是社交媒体、专业平台还是游戏社区,一张独特且能代表个人风格的头像都能让你在…...

拒绝手动对齐!用Clang-format在VSCode实现C++代码完美排版(附自定义宏处理方案)

拒绝手动对齐!用Clang-format在VSCode实现C代码完美排版(附自定义宏处理方案) 在C开发中,代码排版一直是个让人又爱又恨的话题。整洁的代码排版能显著提升可读性,但手动调整对齐却是个耗时耗力的苦差事。特别是当项目规…...

【数据结构与算法】LIS专项练习

LIS 专项练习题目编号说明【模板】最长上升子序列B3637纯LIS模板&#xff0c;n≤10⁵&#xff0c;用二分导弹拦截P1020LIS 贪心&#xff0c;经典题合唱队形P1091LIS LDS 组合友好城市P2782排序后转LIS1.#include<iostream> #include<vector> using namespace std…...

mPLUG-Owl3-2B与C++:高性能计算集成

mPLUG-Owl3-2B与C&#xff1a;高性能计算集成 1. 项目背景与价值 在当今AI应用快速发展的环境下&#xff0c;如何将强大的多模态模型高效集成到现有系统中&#xff0c;成为了很多开发者面临的实际问题。mPLUG-Owl3-2B作为一个支持图文对话的先进模型&#xff0c;在多个场景下…...

穿越机 vs 航拍机:陀螺仪低通滤波参数α到底怎么选?一份基于场景的调参指南

穿越机与航拍机的陀螺仪滤波调参实战&#xff1a;从噪声抑制到飞行风格适配 当你在Betaflight调参界面第一次看到"陀螺仪低通滤波系数α"这个参数时&#xff0c;是否感到困惑&#xff1f;这个看似简单的数值背后&#xff0c;隐藏着飞行器控制的核心矛盾——噪声抑制与…...

PyTorch实战:用PINN求解一维Poisson方程(附完整代码)

PyTorch实战&#xff1a;用PINN求解一维Poisson方程&#xff08;附完整代码&#xff09; 在科学计算领域&#xff0c;微分方程求解一直是核心挑战之一。传统数值方法如有限差分法&#xff08;FDM&#xff09;和有限元法&#xff08;FEM&#xff09;虽然成熟&#xff0c;但面对复…...

OpenClaw+Qwen3-VL:30B:飞书智能客服自动化实战

OpenClawQwen3-VL:30B&#xff1a;飞书智能客服自动化实战 1. 为什么选择这个组合&#xff1f; 去年我在一个小型电商团队负责客服工作&#xff0c;每天要处理上百条用户咨询。最头疼的是遇到"图片文字"的混合问题——比如用户发来商品截图问"这个有没有现货&…...

基于深度学习的面部表情识别:从图片到视频的探索

基于深度学习的面部表情识别 含图片和视频的面部表情识别&#xff0c;含详细的代码运行说明文档。在当今数字化时代&#xff0c;面部表情识别作为人工智能领域的一个重要研究方向&#xff0c;具有广泛的应用前景&#xff0c;如人机交互、情感分析、安防监控等。今天&#xff0c…...

GEE不只是地图工具:用VSCode和Geemap玩转遥感数据可视化(Python实战)

GEE不只是地图工具&#xff1a;用VSCode和Geemap玩转遥感数据可视化&#xff08;Python实战&#xff09; 当大多数人提起Google Earth Engine&#xff08;GEE&#xff09;时&#xff0c;第一反应往往是一个在线地图工具。但如果你真正深入使用过这个平台&#xff0c;就会明白它…...

低配置linux服务器基础优化

以2核1.5G&#xff0c;60G系统盘40G数据盘为例。发现虚拟内存只有1Groothlvps:~# free -htotal used free shared buff/cache available Mem: 1.3Gi 298Mi 1.1Gi 3.5Mi 92Mi 1.0Gi Swap: 974Mi …...

从Clang-Tidy到Cppcheck:C++静态分析工具组合拳配置指南(VSCode+CMake环境)

从Clang-Tidy到Cppcheck&#xff1a;现代C静态分析工具链深度集成指南 为什么需要组合使用静态分析工具&#xff1f; 在当代C开发实践中&#xff0c;单一静态分析工具往往难以覆盖代码质量保障的所有维度。Clang-Tidy作为LLVM生态的核心工具&#xff0c;擅长基于AST的现代C规范…...