java 21 : StringBuilder/StringBuffer/String

String、StringBuffer、StringBuilder String、StringBuffer常用方法参考手册 阅读详情

1 StringBuilder/ StringBuffer

前边我们已经有一篇详细讲解了下String,我们知道String 是一个final类,他不能被继承,方法不能被override。如果直接修改或者append  String串的内容,其实已经是新建了一个String对象。所以,他有一些弊病, 不可能使用在需要频繁对字符串进行改变或者添加的情况下,这时候就应该使用StringBuffer或者StringBuilder.

The StringBuilder/StringBuffer class is an alternative to the String class. In general,
a StringBuilder/StringBuffer can be used wherever a string is used.
StringBuilder/StringBuffer is more flexible than  String. You can add, insert, or
append new contents into a StringBuilder or a StringBuffer, whereas the value of a
String object is fixed, once the string is created.

The StringBuilder class is similar to StringBuffer except that the methods for mod-
ifying buffer in StringBuffer are synchronized. Use StringBuffer if it may be accessed
by multiple tasks concurrently. Using StringBuilder is more efficient if it is accessed by a
single task. The constructors and methods in  StringBuffer and StringBuilder are
almost the same. This section covers StringBuilder. You may replace StringBuilder
by StringBuffer. The program can compile and run without any other changes.

StringBuidler与StringBuffer是类似的,我们都可以直接对StringBuilder/StringBuffer添加、修改、尾接一个新的串进去,依旧是同一个对象。但是他们两者之间的区别在于StringBuffer修改缓冲区的方法是同步的,所以,为了数据安全起见,如果是多线程并发访问的话,就要使用StringBuffer,否则StringBuilder是我们更好的选择,因为毕竟Stringbuffer修改是同步的必然会导致效率低一些。

由于StringBuffer/StringBuilder 是支持直接修改原数据,所以我们从API上可以看到他更多的方法是一些修改、添加、倒置等等这样操作字符串的方法,而像在String中我们不会看到这些功能的方法,这就是各施其职,各自发挥所长。

我们稍微截图看看StringBuilder都有哪些常见的方法:


另外,要知道,在java中,很多方法有(begIndex, endIndex)参数,从来endIndex不会包括在里边,例如上面倒数第三个的replace方法、delete方法等。

例子:

StringBuilder sb=new  StringBuilder();
sb.append("welcome to ");
sb.append("java");
sb.insert(11,"html and ");  //sb变成 welcome to html and java
sb.delete(8,11); //删除index 8-10 这三个字符
sb.deleteCharAt(8);
sb.reverse();

在以上的过程中,从头到尾都是对同一个对象进行,但是如果是使用String的话,每一步都会创建一个新对象、

2 toString、 capacity,length, setLength,charAt 方法

Stringbuilder除了提供上述的对字符串进行修改,添加等的操作外,同时也提供一些方法用来获取对象的一些属性的。


The capacity() method returns the current capacity of the string builder. The capacity is
the number of characters it is able to store without having to increase its size.
The length() method returns the number of characters actually stored in the stringBuilder

 The setLength(newLength) method sets the length of the string builder. If the
newLength argument is less than the current length of the string builder, the string builder is
truncated to contain exactly the number of characters given by the newLength argument. If
the newLength argument is greater than or equal to the current length, sufficient null charac-
ters ('\u0000') are appended to the string builder so that length becomes the newLength
argument. The newLength argument must be greater than or equal to 0.

我们可以使用setLength方法从新设置字符串的长度,如果新设置的长度比原来实际的长度要短,那么StringBuilder会将看原来的字符串截断才新设置的长度,就好像使用了delete了后面多余的字符了。如果新设置的长度比原来实际的长,那么就利用'\u0000' 填充多出的长度。

The builder’s capacity is automatically increased if more characters are added to exceed
its capacity. Internally, a string builder is an array of characters, so the builder’s capacity is the size
of the array. If the builder’s capacity is exceeded, the array is replaced by a new array. The new
array size is 2 * (the previous array size + 1)

我们可以使用 StringBuilder sb=new StringBuilder(initCapacity) 来创建一个有initCapacity空间大小的StringBuidler方法,而当我们给一个Stringbuilder不断添加字符时候,当添加的长度已经超过了原来的capacity, builder的capacity会随着我们的添加而自动增加,在内部中,一个Stringbuilder其实是一个字符数组,所以capacity是字符数组的大小,如果大小超过了,会使用一个新的数组来替换原来的数组,将原来数组的数据给复制到新的数组中,而新的数组的capacity的大小是2*(原来的capacity+1)

所以我们应该慎重的选择我们的initCapacity,过大会造成内存浪费,过小会导致可能超过而需要有复制迁移的操作。


Java字符串三剑客:String、StringBuilder、StringBuffer原理与实战选型 字符串拼接是Java基础开发中最常见也最易出错的操作之一,其性能瓶颈往往源于内存分配策略与对象生命周期管理。理解String的不可变性设计、StringBuilder的无锁高效拼接、StringBuffer的同步机制,本质是掌握JVM字符串常量池、堆内存布局及字节码生成逻辑。从编译期优化(如+号转StringBuilder)到运行时扩容(newCapacity = old*2+1),再到线程安全模型(synchronized粒度与ThreadLocal替代),技术价值体现在GC压力降低、CPU利用率优化和响 阅读详情

相关推荐

Java字符串拼接三剑客:String、StringBuffer与StringBuilder原理与选型指南

字符串拼接是Java开发中最基础也最易被低估的性能关键点。其本质涉及不可变对象设计、堆内存分配、GC压力及线程安全模型等核心机制。String因不可变性保障线程安全与常量池优化,但循环拼接会引发高频对象创建与GC风暴;StringBuffer通过synchronized提供方法级线程安全,却带来显著锁开销;StringBuilder以无锁可变字符序列实现单线程极致性能。在日志组装、JSON构建、SQL生成等高频动态拼接场景中,三者选型直接决定系统吞吐与稳定性。本文结合JVM底层(char[]扩容策略、Str

优快云头条 526

Java中的String、StringBuilder、StringBuffer

1. 继承关系图当使用文本数据时,Java提供了三种类别,包括String, StringBuffer和StringBuilder。当使用大数据来工作时,你应该用StringBuffer或StringBuilder来优化效率。基本上这三个类有许多相似之处。 String 是不可变的(这个概念的更多详细信息,在文档中)。它不允许子类的存在。 StringBuffer, StringBuilder 是可

学习AI算法,请关注微信公众号:机器学习算法全栈工程师…… 868

从UART到RS485:手把手教你用SIT3485E收发器搞定工业级通信(含原理图与PCB布局要点)

本文详细解析了从UART到RS485的工业级通信转换,重点介绍了SIT3485E收发器的原理图设计、PCB布局要点及抗干扰技巧。通过差分信号传输和优化电路设计,实现长距离、多设备稳定通信,适用于工业自动化等复杂环境。

weixin_29169505的博客 345

实现String类对象与StringBuffer类对象之间的相互转换与比较

将String类对象转换成StringBuffer类对象 方法一:利用StringBuffer类的构造方法 StringBuffer sb = new StringBuffer("hello"); 方法二:利用append()方法 StringBuffer sb = new StringBuffer(); sb.append("hello"); 将StringBuffer类对象转换为Strin...

weixin_44228141的博客 738

不同比例尺地质数据共享

包含20w、25w、100w、250w比例尺地质数据共享。

sinat_38828898的博客 2305

具身智能的边缘计算核心构成方案

摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠

老郑的博客 809

代码审查常见代码质量问题

配套的Bug解释模式 为了有针对性的使用这个工具,减少bug的误报,提高使用效率,我们选择了10个左右的bug模式,下面就是对这10个模式的解释。 这些bug可能会引起程序的性能或逻辑问题. 需要说明的是,findbugs能检测的bug pattern远不仅于此,甚至可以定制自己的探测器,因此,这个文档会不断扩充,同时,也欢迎大家不断探索和分享使用实践. 大的分类主要包括以

邢超的博客 2万+

LinuxCNC---在PC端显示开发板LinuxCNC界面

  今天在调试开发板时,执行开发板上的linuxcnc指令,总是出现如下报错 LINUXCNC - 2.9.0~pre0 application-specific initialization failed: couldn't connect to display "192.168.137.3:1" Error in startup script: invalid command name "image" while executing "image create photo -file $f/$i

中华田园巨龙 3469

分析Java中的String、StringBuilder以及StringBuffer

目录 1. String类 2.StringBuffer 3.StringBuilder 4.三者之间的比较 1. String类 从源码中可以看出,String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。 private final ch...

小树的博客 200

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

算法大师! 401

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 575

String/StringBuffer/StringBuilder的区别,实现?

原文地址:http://blog.youkuaiyun.com/ls5718/article/details/51899027 众所周知,String是由字符组成的串,在程序中使用频率很高。Java中的String是一个类,而并非基本数据类型。 不过她却不是普通的类哦!!!   【镜头1】 String对象的创建        1、关于类对象的创建,很普通的一种方式就是利用构造器,Stri

75闪光雷的博客 3283

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 679

14. 【Java】字符串

本文深入解析Java中String类的核心概念与使用技巧,涵盖字符串不可变性、创建方式、字符串常量池、常用方法、拼接性能优化以及JDK 21文本块等关键知识点。通过详细讲解和实战示例,帮助开发者全面掌握String的特性,避免常见误区,提升字符串处理效率与代码质量。

gugucoding的博客 588

【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

还搞不清楚String、StringBuilder、StringBuffer?

代码解释:在堆中创建StringBuilder对象,然后builder指向该对象,"hello"存在StringBuilder 的成员变量value中,value是指向堆的一个byte[]对象,这个byte[]对象的值为"hello"。代码解释:在堆中创建StringBuffer对象,然后buffer指向该对象,"hello"存在StringBuffer的成员变量value中,value是指向堆的一个byte[]对象,这个byte[]对象的值为"hello"。如果大于0,则需要扩容,然后通过复制达到扩容。

qq_73617408的博客 2529

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

String、StringBuilder、StringBuffer

String、StringBuilder、StringBuffer

pig_ning的博客 587

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java面试-String、StringBuilder 和 StringBuffer 的区别与性能对比

《Java面试200问:String、StringBuilder与StringBuffer深度解析》是一篇针对Java字符串处理核心知识的专业指南。文章通过一个实际案例揭示字符串拼接的性能陷阱,系统对比了String、StringBuilder和StringBuffer三大类的特性差异: String的不可变性导致拼接性能极差,适合存储常量 StringBuilder采用可变字符数组,单线程下性能最优 StringBuffer通过synchronized实现线程安全,但性能折中。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Java 中 String、StringBuilder 和 StringBuffer 的区别与适用场景

String不可变,适合常量;高性能,适合单线程;线程安全,适合多线程。性能测试显示拼接快 500 倍。电商订单系统通过实现 P99 延迟 8ms、QPS 12 万。常量String。单线程。多线程或同步。监控字数:约 5100 字(含代码)。如需调整,请告知!String适合常量,适合单线程,适合多线程。订单系统实现 P99 延迟 8ms、QPS 12 万。String。。。监控:Prometheus。

lssffy的博客 1188

String, StringBuilder,StringBuffer的区别和功能

本文将来简单讲解一下String ,StringBuffer和StringBuffer这三者之间的区别,功能以及联系

2503_91154453的博客 595

【Java】—— 常用类和基础API:String、StringBuffer、StringBuilder

因为字符串对象设计为不可变,那么所以字符串有常量池来保存很多常量对象。JDK6中,字符串常量池在方法区。JDK7开始,就移到堆空间,直到目前JDK17版本。

weixin_63106307的博客 1015

String类总结/StringBuffer/StringBuilder

本文目录@[TOC](本文目录)方法1.char charAt(int index)2.boolean equals(Object obj)3.boolean equalsIgonoreCase(String string)4.int compareTo(String string)5.int compareToIgnoreCase(String string)6.boolean startsWith(String prefix,int offset)7.boolean startsWith(String

lisz的博客 1528

String三兄弟-String-StringBuffer-StringBuilder

String三兄弟有什么不同呢,为三兄弟贴上不同标签

weixin_74047328的博客 888

深入探索String、StringBuffer和StringBuilder区别(源码 + 代码验证)

String、StringBuffer和StringBuilder都是Java中用来表示字符串的。在Java中,String类是一个不可变类,任何对String的改变都会引发新的String对象的生成。StringBuffer和StringBuilder则都是可变类,任何对他所指代的字符串都不会产生新的对象。StringBuilder是Java5后提出来的,与StringBuffer相比,StringBuilder有更高的执行效率,但其不是线程安全的。 1. 性能对比 下面对String,StringBuf

weixin_44212764的博客 2940

String,StringBuilder,StringBuffer的区别

String, StringBuilder,StringBuffer分析

qq_59093178的博客 703

05 | String、StringBuffer、StringBuilder 有什么区别?

Java 8 中存于堆中,且 PermGen 被 MetaSpace(元数据区)替代。,被声明成为 final class,所有属性也都是 final 的。Java 1.5 新增,与 StringBuffer 没有本质区别。String 在 Java 6 以后提供了 intern() 方法。,类似拼接、裁剪都会产生新的 String 对象。为解决上面提到拼接产生太多中间对象的问题而提供的一个类。去掉了线程安全部分,绝大部分情况的首选。,但也因此有额外的性能开销。

Balance 1013
上一篇: 无基础新伙伴前期基本linux学习建议
下一篇: 指针与数组(一)
dymom
博客等级 码龄17年 42粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值