Java学习——常用类的学习之String,StringBuilder,StringBuffer三者的区别

Java学习——常用类的学习之String,StringBuilder,StringBuffer三者的区别

最近,在学习字符串常用类时,学习到了String,StringBuilder,StringBuffer三个常用类,在这里整理一下这三者的区别,这三者的区别主要还是在于运行速度和线程安全。

1.运行速度方面:StringBuilder > StringBuffer > String

为什么String运行速度最慢?因为我们知道String一旦创建其值就不能更改,但是StringBuilder,StringBuffer创建后是可以更改其值的 。我们来看一下下面代码:

public class Test {
    public static void main(String[] args) {
        String str = "abc";
        System.out.println(str);//输出:abc
        
        str = str + "ddd";
        System.out.println(str);//输出:abcddd
    }
}

那么有人看到上面的代码就好奇了,不是说String一但创建就不能改变了吗,为什么第二个打印的结果会是abcddd呢?我们看起来像是str的对象被更改了,其实并不是这样。首先先创建一个String对象str,并把“abc”赋给它,然后当运行到 str = str + “ddd”;时,java的JVM虚拟机又创建了一个新的对象str,并把“abc”和“ddd”拼接起来付给它,之前的str没有引用所以被垃圾回器回收掉了。拼串的过程其实是一个不断创建新的对象再赋值的过程。所以String的速度是最慢的。

为了更深刻的理解,我们看一下上面这几行代码的内存图:
在这里插入图片描述

2.在线程方面:

StringBuffer是线程安全的,StringBuilder是线程不安全的。
所以StringBuffer速度要慢与StringBuilder。

看过这两个类的源码都知道StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全。

那么我们在什么情况下使用这三种字符串类呢?
1.String:适用于少量字符串操作的情况
2.StringBuffer:适用于多线程环境下在字符缓冲区进行大量字符串操作的情况
3.StringBuilder:适用于单线程环境下在字符缓冲区进行大量字符串操作的情况

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值