JAVA基础之String StringBuffer和StringBuilder三者的区别

今天来复习下java基础中,String StringBuffer和StringBuilder三者的区别,这也是面试的常考点之一,话不多说,直接上干货!

String

​ String最常用的字符串,在java中String属于对象,同时由于String类是final修饰的,所以String的值是无法改变的。看到这里肯定有疑问 比如以下代码

	String a = "abd";
	System.out.println(a);
	a="c12";
	System.out.println(a);

运行结果后,发现控制台a的值的确改变了

在这里插入图片描述

那么String的值无法改变,这又是怎么回事呢?

要理解这个,首先就得明白String是引用类型。第一句 String a = “abd”,此时在堆内存中已经创造了“abd”这个对象,下一句a=“c12”,其实是在堆内存中继续创造了“c12”这个对象,a的值之所以会发生改变,是因为a的指向从 “abd”变成了“c12”。因此值看起来是改变了,其实是没有改变的,如下图:

在这里插入图片描述

字符串频繁的指向“断开-重写连接”会大大降低性能,同时因为开拓了更多的空间,也会对内存造成威胁,因此对于要经常修改内容的情况,建议使用**:StringBuilder、StringBuffer**

StringBuffer

StringBuffer对象代表的是一个内容可变的字符串。因此,当StringBuffer被创建后,通过提供的 append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的内容

	StringBuffer a = new StringBuffer("123");
	System.out.println(a);
	a.append("23");
	System.out.println(a);

输出结果如下图:
在这里插入图片描述
那么StringBuffer在内存空间中又是怎样的呢?

在这里插入图片描述

如图。我们可以看到,StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中调用了append方法增加了内容,因此值发生了改变

StringBuffer类中在实现方法上增加了 synchronized关键字 如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VaSyWK7R-1590164252379)(E:%5Cimg%5C1590163875079.png)]

这个关键字相当于给方法添加了一个锁,所以从这里来看,StringBuffer的线程是安全的。而StringBuilder类在实现方法上并无 synchronized关键字 ,因此它的线程是不安全的。

StringBuilder

StringBuffer类也代表可变字符串对象 ,它与StringBuffer基本功能基本相似

总结:

综上所述,String StringBuffer StringBuilder的区别大致分为以下两类

  1. String的值不可变,StringBuffer 和StringBuildr的值可变
  2. 运行速度 StringBuilder>StringBuffer>String (StringBuffer有锁,所以性能会降低)
  3. StringBuffer线程是安全的,适合多线程;StringBuilder线程是不安全的,适合单线程
  4. 如果不需要频繁的修改值,用String即可
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值