目录

      • 一. String:不可变的字符串
      • 二.StringBuilder:可变字符串
      • 三.StringBuffer:线程安全的可变字符串
      • 四.总结

在 Java 开发中,字符串处理是日常编码中最频繁的操作之一。String、StringBuilder 和 StringBuffer 这三个类虽然都用于操作字符串,但在性能、线程安全性和使用场景上存在显著差异。

一. String:不可变的字符串

String 类是 Java 中最基础的字符串类,其底层实现具有不可变性:

存储结构:在 JDK 8 及之前,String 内部通过 private final char value[] 数组存储字符;JDK 9 及以上改为 byte[] 数组(根据编码自动选择存储方式,节省内存)。
不可变性:value 数组被 final 修饰,意味着一旦 String 对象创建,其内部的字符序列就无法被修改。任何看似 “修改” 的操作(如拼接、截取)都会创建新的 String 对象,原对象保持不变。

String str = "hello";
str += " world"; // 实际创建了新的 String 对象,原 "hello" 仍存在于内存中

这种设计的优势是:

天然线程安全(多线程只能读取,无法修改) 可作为 HashMap 等集合的键(哈希值不会变化) 字符串常量池复用,节省内存
但缺点也很明显:频繁修改会产生大量临时对象,导致 GC 压力增大,性能下降。

二.StringBuilder:可变字符串

存储结构:内部通过 char[] value 数组存储(无 final 修饰),支持动态扩容。

默认初始容量为 16; 当字符长度超过当前容量时,会创建一个新的数组(容量为原容量的 2 倍 + 2),并将原数据复制到新数组中。

可变性:所有修改操作(如 append()、insert()、delete())都直接操作底层数组,不会创建新对象(除非需要扩容)。

StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 直接在原数组上修改,不创建新对象

由于省去了创建新对象的开销,且没有同步锁的消耗,StringBuilder 成为单线程下字符串拼接的首选。

三.StringBuffer:线程安全的可变字符串

tringBuffer 是早期 Java 提供的可变字符串类,与 StringBuilder 最大的区别是线程安全性:

存储结构:与 StringBuilder 基本一致,内部也是 char[] value 数组。
线程安全:通过在所有公共方法上添加 synchronized 关键字实现线程安全,确保多线程环境下的操作原子性。

public synchronized StringBuffer append(String str) {// 具体实现
}

这种设计保证了线程安全,但也带来了同步锁的性能开销,因此在单线程环境下效率低于StringBuilder。

四.总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96839.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96839.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96839.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Power Automate List Rows使用Fetchxml查询的一个bug

看一段FetchXML, 这段查询在XRMtoolbox中的fech test工具里执行完全ok<fetch version"1.0" mapping"logical" distinct"true" no-lock"false"> <entity name"new_projectchange"> <link-entity name"sy…

Letta(MemGPT)有状态AI代理的开源框架

1. 项目概述Letta&#xff08;前身为 MemGPT&#xff09;是一个用于构建有状态AI代理的开源框架&#xff0c;专注于提供长期记忆和高级推理能力。该项目是MemGPT研究论文的实现&#xff0c;引入了"LLM操作系统"的概念用于内存管理。核心特点有状态代理&#xff1a;具…

除了ollama还有哪些模型部署方式?多样化模型部署方式

在人工智能的浪潮中&#xff0c;模型部署是释放其强大能力的关键一环。大家都知道ollama&#xff0c;它在模型部署领域有一定知名度&#xff0c;操作相对简单&#xff0c;受到不少人的青睐。但其实&#xff0c;模型部署的世界丰富多样&#xff0c;今天要给大家介绍一款工具&…

Linux系统学习之进阶命令汇总

文章目录一、系统信息1.1 查看系统信息&#xff1a;uname1.2 查看主机名&#xff1a;hostname1.3 查看cpu信息&#xff1a;1.4 当前已加载的内核模块: lsmod1.5 查看磁盘空间使用情况: df1.6 管理磁盘分区: fdisk1.7 查看目录或文件磁盘使用情况: du1.8 查看I/O使用情况: iosta…

算法面试(2)------休眠函数sleep_for和sleep_until

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 这两个函数都定义在 头文件中&#xff0c;属于 std::this_thread 命名空间&#xff0c;用于让当前线程暂停执行一段时间。函数功能sleep_for(rel_time)让当前线程休眠一段相对时间&…

贪心算法应用:5G网络切片问题详解

Java中的贪心算法应用&#xff1a;5G网络切片问题详解 1. 5G网络切片问题概述 5G网络切片是将物理网络划分为多个虚拟网络的技术&#xff0c;每个切片可以满足不同业务需求&#xff08;如低延迟、高带宽等&#xff09;。网络切片资源分配问题可以抽象为一个典型的优化问题&…

Android WorkManager的概念和使用

1. WorkManager基础与核心概念 1.1 WorkManager概述 WorkManager是Android Jetpack架构组件库的核心成员&#xff0c;专为管理可靠的后台任务而设计。它提供了一套统一的API&#xff0c;用于调度需保障执行的延迟型异步任务&#xff08;如数据同步、日志上传&#xff09;&…

容器使用卷

1.创建一个卷并让容器挂载该卷1.创建一个卷[roothost1 ~]# docker volume create test-vol test-vol2.列出本地 Docker 主机上的卷[roothost1 ~]# docker volume ls DRIVER VOLUME NAME local test-vol3.查看该卷的详细信息[roothost1 ~]# docker volume inspect test-v…

高数基础知识(下)②

文章目录七、微分方程7.3 高阶线性微分方程7.3.1 线性微分方程的解的结构7.3.2 常系数齐次线性微分方程7.3.3 常系数非齐次线性微分方程八、多元函数微分学8.1 偏导数8.2 全微分8.3 基本定理8.4 复合函数微分法8.5 隐函数微分法8.6 多元函数的极值8.6.1 无条件极值8.6.2 条件极…

从0°到180°,STM32玩转MG996R舵机

1.MG996R舵机的性能参数参数数值产品型号MG995/MG996R产品重量55 g工作扭矩13 kgcm反应速度53-62 R/M使用温度-30C ~ 55C死区设置4 微秒插头类型JR、FUTABA 通用转动角度180&#xff08;左90&#xff0c;右90&#xff09;舵机类型数码舵机使用电压3.0 - 7.2 V工作电流100 mA结构…

[frontend]mermaid code2image

hello everyone, welcome to my bolg, here i will introduce something interesting, and if you are interested it, please just let me know. follow me and send me a message are both avaiable. what is mermaid? Mermaid 是一个工具&#xff0c;它能让你用简单的文字代…

Jakarta EE 在 IntelliJ IDEA 中开发简单留言板应用的实验指导(附完整代码)

Jakarta EE 在 IntelliJ IDEA 中开发简单留言板应用的实验指导(附完整代码) 摘要:实验基于Jakarta EE 9+(兼容Tomcat 10+)、Maven作为构建工具,并在IntelliJ IDEA 2023.2(Community版免费)中进行。项目使用Maven Archetype WebApp模板生成基础结构,然后升级到J…

JavaScript经典面试题一(JavaScript基础)

目录 一、JavaScript中的变量提升 1. 机制 2. 示例 3. 注意事项 4. 总结 二、var、let和const的区别。 1. 作用域&#xff08;Scope&#xff09; 2. 变量提升&#xff08;Hoisting&#xff09; 3. 重新赋值和重新声明 4. 示例 示例1&#xff1a;作用域和块级行为 示…

数据库造神计划第七天---增删改查(CRUD)(3)

&#x1f525;个人主页&#xff1a;寻星探路 &#x1f3ac;作者简介&#xff1a;Java研发方向学习者 &#x1f4d6;个人专栏&#xff1a;《从青铜到王者&#xff0c;就差这讲数据结构&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此简单&a…

AWS SQS 可观测性最佳实践

AWS SQS AWS SQS&#xff08;Amazon Simple Queue Service&#xff09;是一种完全托管的消息队列服务&#xff0c;用于在分布式系统中解耦和缓冲消息。它支持高可用性、可扩展性和安全性&#xff0c;能够处理大量消息&#xff0c;确保消息的可靠传输和顺序性。开发者可以轻松集…

AI推理范式:从CoT到ReAct再到ToT的进化之路

在人工智能领域&#xff0c;如何让模型像人类一样进行复杂推理和问题解决&#xff0c;一直是核心挑战。近年来&#xff0c;思维链&#xff08;Chain-of-Thought, CoT&#xff09;、推理与行动&#xff08;ReAct&#xff09; 和 思维树&#xff08;Tree-of-Thoughts, ToT&#x…

2025时序数据库选型:深入解析IoTDB从主从架构基因到AI赋能的创新之路

原创经验总结,拒绝空谈,用数据和实战说话 时序数据时代的"四重考验" 在智慧工厂、新能源车、金融市场等场景中,每秒百万级的数据点如潮水般涌来。这些时序数据背后隐藏着四大核心挑战:极高的写入并发、强时间关联性查询、海量数据生命周期管理,以及乱序与高基…

深入浅出LVS负载均衡群集:原理、分类与NAT模式实战部署

深入浅出LVS负载均衡群集&#xff1a;原理、分类与NAT模式实战部署 文章目录深入浅出LVS负载均衡群集&#xff1a;原理、分类与NAT模式实战部署一、企业群集&#xff1a;从单台服务器到分布式架构的必然选择1. 什么是群集&#xff1f;2. 为什么需要群集&#xff1f;二、企业群集…

Flash Table实测:JAI赋能低代码开发,重塑企业级应用构建范式

目录&#x1f50d; 引言1.1 什么是Flash Table1.2 低代码平台的进化与FlashTable的革新✨FlashTable背景&#xff1a;为什么需要新一代低代码平台&#xff1f;2.1 传统开发的痛点2.2 低代码平台的局限2.3 FlashTable的差异化定位&#x1f4bb; FlashTable安装&#xff1a;Docke…

SonarQube代码质量管理平台本地化搭建和使用

SonarQube 是一个开源的代码质量管理平台&#xff0c;主要用于持续检查代码质量&#xff0c;支持多种编程语言。 本文章记录了在windows环境中&#xff0c;搭建和使用SonarQube的完整过程。 ①SonarQube平台搭建 SonarQube最新社区版本下载地址&#xff1a; https://www.son…