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方法增加了内容,因此值发生了改变

StringBuilder

StringBuilder类也代表可变字符串对象 ,它与StringBuffer基本功能基本相似,唯一不同的是,StringBuffer类中在实现方法上增加了 synchronized关键字 如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VaSyWK7R-1590164252379)(E:%5Cimg%5C1590163875079.png)]

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

总结:

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

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

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读