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

Java中 String、StringBuilder 和 StringBuffer 的区别? - 指南

在Java中,StringStringBuilder 和 StringBuffer 都用于处理字符串,但它们在可变性线程安全性性能上有显著区别。以下是它们的对比:


1. String

  • 不可变性(Immutable)
    String 对象一旦创建,内容不可修改。任何修改操作(如拼接、替换)都会生成新的 String 对象。

    java

    String s = "hello";
    s += " world"; // 创建新对象,原对象"hello"不变
  • 线程安全
    由于不可变,String 是线程安全的。
  • 性能问题
    频繁修改字符串(如循环拼接)会产生大量临时对象,影响性能。

2. StringBuilder

  • 可变性(Mutable)
    StringBuilder 的内容可以修改,直接在原对象上操作,不会创建新对象。

    java

    StringBuilder sb = new StringBuilder("hello");
    sb.append(" world"); // 直接修改原对象
  • 非线程安全
    方法未加同步锁,多线程环境下不安全。
  • 高性能
    适合单线程下的频繁字符串操作(如循环拼接)。

3. StringBuffer

  • 可变性(Mutable)
    与 StringBuilder 类似,内容可修改。

    java

    StringBuffer sb = new StringBuffer("hello");
    sb.append(" world"); // 直接修改原对象
  • 线程安全
    方法通过 synchronized 加锁,保证多线程安全,但性能略低。
  • 适用场景
    需要线程安全的字符串操作(如全局共享的字符串缓冲区)。

对比总结

特性StringStringBuilderStringBuffer
可变性不可变可变可变
线程安全
性能低(频繁修改)高(单线程)较低(线程安全开销)
适用场景字符串常量单线程频繁修改多线程字符串操作

如何选择?

  1. 优先用 String:字符串内容不变化或初始化后不再修改时(如配置信息)。
  2. 单线程频繁修改:用 StringBuilder(如循环拼接字符串)。
  3. 多线程环境:用 StringBuffer(或通过局部变量避免共享)。

示例代码

java

// String 拼接(产生多个对象)
String s = "a";
for (int i = 0; i < 10; i++) {
s += "b"; // 每次循环创建新对象
}
// StringBuilder(高效单线程拼接)
StringBuilder sb = new StringBuilder("a");
for (int i = 0; i < 10; i++) {
sb.append("b"); // 直接修改原对象
}
// StringBuffer(线程安全拼接)
StringBuffer sbf = new StringBuffer("a");
synchronized(sbf) { // 手动同步(非必须,append本身是线程安全的)
sbf.append("b");
}

理解这些区别有助于根据场景选择最优的字符串处理方式。

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

相关文章:

  • 常用的 HTTP 请求方法和区别
  • C#和Lua相互访问 - 详解
  • jemter 安装
  • Day20创建对象内存分析
  • 熬夜三天!SpringCloud Gateway 动态路由失效,背后黑手竟是它……
  • 解析 Authenticode 部分代码。
  • cmd 执行git bash 命令
  • 实用指南:力扣2132. 用邮票贴满网格图
  • 安全向量模板类SiVector - 实践
  • ONCHAINID源码分析(二)
  • 最佳三维文件格式,以及怎么在线浏览编辑FBX/OBJ/GLB/GLTF
  • ChatGPT 在招聘诈骗领域的应用
  • FR报表下拉框高度(JS添加css样式方式)调整
  • 基于Python+Vue开发的新闻管理系统源码+运行步骤
  • 鸿蒙应用开发从入门到实战(十二):ArkUI组件ButtonToggle
  • Spring框架中的注解主要有哪些
  • 领码优秀的方案|Spring Boot 异步请求深度剖析:从原理到 AI 驱动的吞吐量优化
  • 从视觉、文案到交互:三步彻底去除产品AI味
  • 理解WPF Stylet中Command={s:Action 方法名}的设计与实现
  • 帆软报表下拉框高度(JS添加css样式方式)调整
  • 探索 12 种 3D 文件格式:综合指南
  • 剑指offer-32、把数组排成最⼩的数
  • 强化学习算法如何控制人形机器人行走的 —— 策略映射动作,动作如何控制电机?
  • CG-65 剖面细管式温度传感器 可实时监测不同土层温度动态
  • list集合根据某字段获取某个对象
  • .NET STS 版本支持 24 个月
  • 后缀数组基础 Suffix Array
  • 完整教程:第33章 AI在教育领域的应用
  • python微博舆情分析系统 情感分析 爬虫 机器学习 新浪微博 信息采集 大数据工艺(源码)✅
  • 易软通openWMS - 功能齐全的开源WMS