String、StringBuilder、StringBuffer都是什么呢?他们有什么区别?

目录

1. String类

1.1 String对象:

1.2 String对象是“不可变的”、“不可扩展的”。

2. StringBuilder

3. StringBuffer

3.1 StringBuffer是如何实现线程安全的呢?


1. String类

        “String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。”

        这是一个官方的解释,看到这样的解释是不是一脸懵呢。

1.1 String对象:

        创建String类最简单的方式是:

                String a = "ab";

        同时,String是一个对象类那同样可以new一个对象来创建:

                String b = new String("cd");

        String 创建的字符串存储在常量池中,而 new 创建的字符串对象在堆上:

String、StringBuilder、StringBuffer都是什么呢?他们有什么区别?
内存存储空间

1.2 String对象是“不可变的”、“不可扩展的”。

        比如我们给a再赋值:

                a = "bc";

        那么,会在常量池中开辟一个新的内存空间存放"bc"常量并指向它的地址,如图:

String、StringBuilder、StringBuffer都是什么呢?他们有什么区别?

        所以说String是不可变的、不可扩展的;

2. StringBuilder

        StringBuilder是一个可变的字符序列,非线程安全。它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。比如:

String、StringBuilder、StringBuffer都是什么呢?他们有什么区别?

3. StringBuffer

        StringBuffer是字符串变量,它和StringBuilder类似,它的对象也是可以扩充和修改的。但是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

3.1 StringBuffer是如何实现线程安全的呢?

        如图展示的是StringBuffer的部分方法源码:

String、StringBuilder、StringBuffer都是什么呢?他们有什么区别?

其很多方法都加了 synchronized , 也就是同时刻只能有一个线程去执行一个方法。

关键的获取长度 , 增加方法以及其它方法 , 都是加了锁的 .所以是线程安全的。

但是,它的效率不高。

上一篇:java基础


下一篇:String类的基本运用一