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 创建的字符串对象在堆上:

内存存储空间

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

        比如我们给a再赋值:

                a = "bc";

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

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

2. StringBuilder

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

3. StringBuffer

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

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

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

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

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

但是,它的效率不高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值