当前位置: 首页 > 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.dtcms.com/a/365646.html

相关文章:

  • WHAT - 协程及 JavaScript 具体代码示例
  • PgManage:一款免费开源、跨平台的数据库管理工具
  • Packet Radio Network,PRNET
  • 从发现到恢复,看瑞数信息如何构建“抗毁重构”实战路径
  • VR节约用水模拟体验系统:沉浸式体验如何改变我们的用水习惯
  • 全员0门槛数据分析:纷享销客BI Agent,让数据价值直抵业务
  • 实现信号的小波分解和重构
  • 自动化仓库托盘搬运减少错误和损坏的方法有哪些?实操案例解读
  • 12、Docker基本概念 容器与镜像与安装
  • MyBatis xml配置文件
  • 借助Aspose.ZIP SDK,在 C# 中压缩和提取 LZIP 文件
  • ubuntu的2T新硬盘分区、格式化并挂载
  • Linux学习:生产者消费者模型
  • 明远智睿 3568 核心板:四核 Cortex - A55 架构驱动的性能新标杆
  • C++中cdecl、stdcall、fastcall、thiscall异同——10分钟弄清
  • linux0.12 head.s代码解析
  • Alpha World赞助Hello Blockchain Thailand,AWT成为全球共识焦点
  • 袋鼠云产品功能更新报告14期|实时开发,效率再升级!
  • 【IQA技术专题】NIQE代码讲解
  • VMWare上搭建分布式Hadoop集群
  • STM32F103按钮实验
  • 大语言模型领域最新进展
  • 笔记:卷积神经网络(CNN)
  • rust学习之开发环境
  • 从 0 到 1 吃透 Nacos:服务发现与配置中心的终极实践指南
  • 阅兵时刻,耐达讯自动化RS485 转 Profinet 网关助力矿山冶金连接迈向辉煌
  • BurpSuite_Pro_V2024.6使用教程-Burp Suite代理设置详解
  • 张琦《认知破局》读书笔记
  • 内存保护单元MPU
  • 用资产驱动方法构建汽车网络安全档案