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

一、String 

1、String是字符串常量,Java中的字符串是属于对象,由String类生成,String的值是不可以改变的,每次对String进行操作都会生成新的String对象。

从源码从可以看出是final类型的,有final修饰的类叫做最终类,它不能被继承,final修饰的方法不能重写。

(String部分源码如下)

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

 

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

 

使用方法如下:

String str = "Hello";

二、StringBuffer  

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

 

使用方法如下:

 

 

线程安全证明如下:

 

 三、StringBuilder

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

 

 

 4、线程安全补充

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

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

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

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

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

5、使用说明

(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder

posted @ 2019-11-20 15:11  cow09  阅读(240)  评论(0)    收藏  举报