String、StringBuffer与StringBuilder之间区别

本文详细介绍了Java中的String、StringBuffer和StringBuilder类的区别和使用场景。String是不可变的,每次修改都会创建新对象,适合少量操作;而StringBuffer和StringBuilder是可变的,适合频繁修改,其中StringBuilder在单线程环境下性能更优。StringBuffer在多线程环境下因线程安全而使用,其性能稍逊。文章还列举了几个关键方法如append、insert、delete等,展示了它们的使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.String

String是引用数据类型,在java.lang 包中提供了 String 类,该类中使用final关键字修饰用来保存字符串内容的(char或byte)数组,所以String是不可变的
JDK8采用char数组:private final char value[ ]
JDK9采用byte数组: private final byte[ ] value

适用情景:适用于少量的字符串操作的情况

这就导致每次对String的修改都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间。性能和内存开销都比较大。
但StringBuffer和StringBuilder就弥补了不足。StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

2.StringBuffer和StringBuilder

StringBuffer和StringBuilder都继承自AbstractStringBuilder父类,在AbstractStringBuilder中使用char[ ] value字符数组保存字符串,但是没有用final关键字修饰,所以StringBuffer 和 StringBuilder 都是可变的
StringBuffer 和 StringBuilder 的操作是直接改变字符串对象本身,而不是生成新的字符串,所以性能开销比较小。

相同情况下,使用StringBuilder相比使用StringBuffer能获得10%-15%左右的性能提升,但需要承担多线程不安全的风险。

1>StringBuffer

StringBuffer在JDK1.0的时候已经存在,并且对操作方法加了synchronized同步锁,所以是线程安全的,但开销比较大,性能较低。

适用情景:多线程频繁修改字符串

	StringBuffer sb = new StringBuffer("AA");
	sb.append("BB"); //追加
	sb.append("CC");
	sb.append("DD");
	System.out.println(sb);

2>StringBuilder

StringBuffer在JDK1.5的时候才有,没有对方法加同步锁,所以是线程不安全的,但开销比较小,性能较高。

适用情景:单线程频繁修改字符串

	StringBuilder sbd = new StringBuilder("AA");
	sbd.append("BB"); //追加
	sbd.append("CC"); //追加
	sbd.append("DD"); //追加
	System.out.println(sbd);

3.StringBuilder和StringBuffer的方法

StringBuilder和StringBuffer的方法基本相同,在此以StringBuilder为例。

append()

功能:在一个字符串后面追加字符串
传入:追加的字符串str2
返回:追加后的字符串

//创建StringBuilder类对象sbd
StringBuilder sbd = new StringBuilder("ABC");

// 追加
sbd.append("just");
System.out.println(sbd);

insert( )

功能:对字符串进行插入操作
传入:
参数1:插入位置下标
参数2:插入字符串
返回:插入后的字符串

sbd.insert(0, "sos"); //插入位置为0,相当于添加至字符串的头部
sbd.insert(6, "H"); //插入位置为6
System.out.println(sbd);

deleteCharAt( )

功能:删除字符串指定位置字符
传入:删除的位置下标
返回:删除后的字符串

sbd.deleteCharAt(6); //删除下标位置为6的字符
System.out.println(sbd);

delete( )

功能:删除字符串某个区间字符
传入:开始位置和结束位置下标
返回:删除后的字符串

sbd.delete(0, 3); //删除0-3之间的所有字符
sbd.delete(3, 7); //删除3-7之间的所有字符
		
System.out.println(sbd);

toString( )

功能:将StringBuilder类型转换为String类型
传入:无
返回:String字符串

String str = sbd.toString();
System.out.println(str);

如有不足,请不吝指教。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值