【JAVA学习之路 | 提高篇】StringBuffer与StringBuilder

简介: 【JAVA学习之路 | 提高篇】StringBuffer与StringBuilder

1.区别

(1). String : 不可变字符序列.


(2). StringBuffer : 可变字符序列.线程安全,但效率低.


(3). StringBuilder : 可变字符序列.线程不安全,但效率高.


既然StringBuffer与StringBuilder都是可变字符序列,但二者咋区分开呢?


查看源码 : 发现StringBuffer类中的方法都用了synchronized修饰,即其中的方法都是同步方法.故线程更安全.

查看源码 : StringBuilder类中的方法并没有用到synchronized修饰.线程不安全.但节省了握锁的时间,所以效率更高.

2.StringBuffer/StringBuilder可变性分析

(1). 针对于StringBuilder来说,有两个属性需要注意.其实你在该类的源码中是找不到这两个属性的,因为他们其实声明在其父类AbstractStringBuilder中.


(jdk8.0版本)char[] value : 存储字符序列.注意,String类中该数组是用final修饰的,而此处没有,侧面也可以体现出可变性序列.

int count : 实际存储字符的个数.

StringBuilder sBuilder1 =new StringBuilder();
 
//char[] value = new char[16];
 
sBuilder1.append("hex");
 
//value[0] = 'h';
//value[1] = 'e';
//value[2] = 'x';

(2).因为我用的是jdk17版本,所以源码value数组我byte[]类型.

StringBuilder sBuilder1 =new StringBuilder()底层

//构造器
public StringBuffer() {
        super(16);
    }
//底层new了一个16个字节的字节数组
value = new byte[capacity];

StringBuilder sBuilder2 =new StringBuilder("abc")底层

public StringBuilder(String str) {
        super(str);
    }
 
//截取了一部分源码
int length = str.length();
        int capacity = (length < Integer.MAX_VALUE - 16)
                ? length + 16 : Integer.MAX_VALUE;
coder = initCoder;
        value = (initCoder == LATIN1)
                ? new byte[capacity] : StringUTF16.newBytesFor(capacity);

很清晰看到 : byte[] value =new byte[16+str.length()];


append : 追加


如果append的字符串的长度<16,如下.


如果追加的字符串长度>16,先判断有没有length是否大于16*2+2;如果小于34,则分配char[] value =new char[34];如果大于,则分配char[] value =new char[str.length];

StringBuilder sBuilder1 =new StringBuilder()
 
//char[] value = new char[16];
 
sBuilder1.append("hex");
 
//value[0] = 'h';
//value[1] = 'e';
//value[2] = 'x';

3.说明

  • 如果开发中需要对字符串频繁的进行增删插的操作,就考虑使用StringBuffer/StringBuilder.
  • 如果开发中不涉及到多线程问题,则考虑使用StringBuilder,因为它效率更高.
  • 如果开发中大体确定字符串的长度,则可以考虑使用StringBuilder带参构造器,避免底层多次扩容操作.

4.StringBuilder/StringBuffer常见方法.

//字符串追加
public StringBuilder append(StringBuffer sb)
 
//字符串删除[start, end)
public StringBuilder delete(int start, int end)
 
//删除字符串指定索引字符
public StringBuilder deleteCharAt(int index)
 
//字符串替换
public StringBuilder replace(int start, int end, String str)
 
//字符串插入
public StringBuilder insert(int offset, String str)
 
//字符串反转
public StringBuilder reverse()
相关文章
|
2月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
48 1
|
8天前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
19天前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
42 18
|
1月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
105 6
【Java学习】多线程&JUC万字超详解
|
17天前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
2月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
47 0
|
Java
Java---StringBuffer()方法的简单应用
Java---StringBuffer()方法的简单应用
130 0
|
Java
Java---StringBuffer()方法的简单应用
描述:在实际应用中,经常回遇到对字符串进行动态修改。这时候,String类的功能受到限制,而StringBuffer类可以完成字符串的动态添加、插入和替换等操作。 1、构造函数。
709 0
|
7天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
11天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
下一篇
无影云桌面