String,StringBuffer,StringBuildee的区别是什么?String为什么是不可变的?

Posted hjdk05

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String,StringBuffer,StringBuildee的区别是什么?String为什么是不可变的?相关的知识,希望对你有一定的参考价值。

1、String是常量字符串,从源码从可以看出是final类型的,有final修饰的类叫做最终类,它不能被继承,final修饰的方法不能重写。而它的值可以改变,比如常量值。

(String部分源码如下)

技术图片

(final类不能被继承)如下:

技术图片

 

(final方法不能重写)如下:

 技术图片

使用方法如下:

String str = "Hello";

  

2、StringBuffer是字符串变量,使用前得实例化。StringBuffer继承自抽象类AbstractStringBuilder,同样不能被继承。它的对象被创建后内容就不能变了。内部方法线程安全,方法有synchronized修饰

技术图片

 

使用方法如下:

 技术图片

 

线程安全证明如下:

技术图片

 

 

 3、StringBuilder跟StringBuilder一样是字符串变量,类继承自抽象类AbstractStringBuilder,同样不能被继承。不过与StringBuffer不同的是它的内部方法没有synchronized修饰,即非线程安全的

技术图片

 

 

 4、线程安全补充

线程安全会更加消耗系统资源,因此StringBuilder的效率比StringBuffer高。

(1)在万级的使用里面几乎没有差距

(2)在十万级,效率差距逐渐显现,StringBuilder效率逐渐占上风

(3)在亿级以后,两者差距不大,不过StringBuilder稍微快些

(4)在占用内存方面,在百万级别以后,StringBuilder使用的内存稍低,亿级后差不多。

以上是关于String,StringBuffer,StringBuildee的区别是什么?String为什么是不可变的?的主要内容,如果未能解决你的问题,请参考以下文章

String,StringBuffer与StringBuilder的区别

(转)String,StringBuffer与StringBuilder的区别

重温java中的String,StringBuffer,StringBuilder类

Java常用类--String类(StringBuilder 和 StringBuffer)介绍

StringBuffer和StringBuilder类

StringBuffer的替换功能