java中的string、StringBuffer、StringBuilder的区别与联系

java中String、StringBuffer、StringBuilder的区别与联系
前几天,在复习java基础知识的时候,了解到了java中string、StringBuilder、StringBuffer相关知识,今天在这里总结一下。
1. String是字符串常量,是被final修饰的,所以不可被继承,一旦创建之后是不可以被修改的。如下图:
这里是String类型的相关源码
那么当我们定义一个string类型的字符串变量的时候,会是怎么一个过程呢?
String str =“abc”;
System.out.println(str);
str=str+“hello”;
System.out.println(str);
代码分析:
当然了,以上的代码运行完成的时候,第一个输出的是abc,第二次输出的是abchello,此时当执行完第三行的时候,是在堆内存中创建了两份内存,即是“abc”和“abchello”,这时候将新拼接的赋给了str,而以前创建的旧的str就会被回收,但是这两份内存并不会即时的机会被GC(垃圾回收机制),GC的是在jvm某个时候,才开始操作的,所以会有明显的开辟内存,并且又有回收内存,这时候引起string的速度变慢。所以在这里总结一句话就是,java中的string是一个不断创建新的对象并且是将旧的对象回收的一个过程,所以来说性能会很慢。
然而,StringBuffer与StringBuilder就有所不同了,这两个都是变量,而变量操作的是本身的对象,所以在性能方面优于string。相关执行性能详见另一篇博客相关性能比较
2. 从线程方面来讲
刚才看了一下相关的源代码,如下图:
在这里插入图片描述在这里插入图片描述 StringBuilder与StringBuffer这个类中都是继承了AbstractStringBuilder的这个类,但是在具体的方法中的时候,StringBuffer中有synchronized这个关键字,适用于多线程的环境当中,而StringBuilder当中没有相关的synchronized的关键字,不可以运用于多线程的环境当中。所以有的文章中会说StringBuffer是线程安全的,StringBuilder是线程不安全的。所以可以有这么一个结论,在多线程的时候用StringBuffer,但是在单线程中的话使用相对执行速度较快的StringBuilder。
总结:
1. String是字符串常量,每次都会创建一个新的对象,而且每次创建的对象不可以修改。
2. StringBuffer 字符串变量,可变,线程安全,适用于大量字符串的拼接,拼接时用append。
3. StringBuilder 字符串变量,可变,线程非安全,适用于大量字符串的拼接,拼接时用append。
4. 经常改变字符串内容的时候,尽量不要使用String,因为执行效率慢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值