Java中String类、StringBuilder、StringBuffer详解

String类
首先,看看String类的源代码:
在这里插入图片描述
从中我们能得到一些信息:
·String类被final修饰,不能被继承;
·String实现了序列化接口以及比较的Comparable接口
·String类的底层是一个char型数组,且被final修饰,说明其数组的指向不能被修改,又因其是private的权限,所以可以看作String的值不能被修改。
接下来挑选其中的一些方法研究:
在这里插入图片描述
在这里插入图片描述
我们可以看出,其最后的结果要么不变,要么new一个新的字符串,即String类的不可变性。String对象一旦创建就是不可改变的了,任何对于原String类对象的修改都会创建一个新的String对象,倘若一个String对象不再被引用,那么将会被回收。
字符串常量池
由于String类使用的频繁,JVM为了提高性能,在实例化字符串时便做了优化:字符串常量池。每当我们要创建一个字符串时,都会首先查看常量池中是否有这样的字符串,有则直接引用,没有则新建。如:
String a =“aa”;String b =“aa”;那么 a == b返回的是true;都是栈中的一个变量指向同一个常量池中的内容地址。但是查看String源码,我们发现可以通过:String c=new String(“aa”);的方式来创建String对象,此时a==c的结果是什么呢?答案是false,因为通过new的方式仍会在常量池中查找有无"aa",但接下来便是在堆上创建一个对象,指向"aa",而c变量指向的是对象的引用,因此返回值是false。
因此,我们也能从此得出,应该尽量用字面量(即第一种创建字符串的方式),可以提高程序的性能。
字符串拼接
我们知道,字符串之间可以通过"+“进行拼接:
在这里插入图片描述
输出结果为:在这里插入图片描述
可以看见,确实是对字符串进行了拼接,那么是如何实现的呢?我们看看其字节码:在这里插入图片描述
我们可以很清楚的看见,原来是编译器的底层为我们创建了一个StringBuilder的对象,每次”+" 就会调用append方法。但是仔细观察,发现只调用了4次append方法,而我们有5个"+",应该是6次append调用啊?我们看看字节码的13行和22行"xxyy"和"zzmm",而源程序中是"xx"+“yy"和"zz”+“mm”,原来是编译器对我们的常量进行的一些优化,早就将其拼接在了一起,而在变量的拼接时才会调用append方法。最后调用toString()生成String对象。

StringBuilder
在这里插入图片描述
我们可以看到,在JDK1.5中加入了StringBuilder类,其也是由final修饰的,即不能被继承。其构造器是调用父类的方法,我们点进去看:在这里插入图片描述
发现底层仍维护了一个char[]数组,怎么感觉和String如此的像?那么StringBuilder又是来干嘛的呢?查看以下其方法:
在这里插入图片描述
在这里插入图片描述
我们发现其底层数组大小和内容是可以修改的,而非String的不可变性,最后调用其toString方法可以将其转换为String:
在这里插入图片描述

既然可以扩容,那么再来看看是如何扩容的。通过无参构造函数我们可以看见默认的char[]长度为16,也可以自己传入一个给定的长度参数 或者String,若是String则大小为16+String.length(); 当不断有操作往数组中添加内容导致容量不足时进行扩容,扩容代码如下:
在这里插入图片描述
总的来说,我们可以认StringBuilder是可变的String,且性能高于String。
StringBuffer
在这里插入图片描述
阅读一下StringBuffer的说明,我们会发现StringBuffer好像可变的String(怎么这么像StringBuilder?),且能在多线程下安全的使用。然后查看其方法发现,每个方法前面都用了synchronized修饰,其余的和StringBuilder没有什么区别,因此可以看作线程安全版的StringBuilder。

至此,做个总结:String类、StringBuilder、StringBuffer都是被final修饰的不可被继承的类。String类的不可变性及其在常量池的缓存,一定程度上能提高性能,但是会频繁的创建对象,而StringBuilder是可变的,性能又高于String,但是只在于单线程中的使用,多线程中使用StringBuffer更安全,虽然会降低性能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值