详解java中String、StringBuilder、StringBuffer的区别
作者:公众号勾玉技术 时间:2023-06-17 06:03:23
你知道String、StringBuilder、Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?
别急,这篇文章带你解决这些问题。
可变性
首先,String是字符串,我们一般这样声明:
String s = "abc";
String类使用被final修饰的char数组来存储字符串的内容,它的一大特性就是不可变,怎么理解这个不可变呢?
我们知道,一个类被final修饰,那么这个类无法被继承,方法也不能被重写,属性也不能改变。
看看这段代码:
String s = "abc";
s = s+1;
System.out.print(s); // 输出: abc1
表面上s的值由abc变成了abc1,其实并不是这样,而是在进行+1的操作时,重新创建了一个新的String对象,并给它赋值为abc1.
StringBuilder和StringBuffer这俩货同样用char数组存字符串,但并没有用final修饰,因此它们创建的内容的可变的,并不像String那样创建了一个新的对象。
线程安全性
String是常量,自然没有线程不安全的问题,但是StringBuilder和StringBuffer是变量,就需要考虑这个。
我们查看StringBuilder的源码:
@Override
public int compareTo(StringBuilder another) {
return super.compareTo(another);
}
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
再看看StringBuffer的:
@Override
public synchronized int compareTo(StringBuffer another) {
return super.compareTo(another);
}
@Override
public synchronized int length() {
return count;
}
@Override
public synchronized int capacity() {
return super.capacity();
}
发现没有,StringBuffer的每个方法都加了synchronized同步锁,保证了线程安全,而StringBuilder没加。
性能比较
StringBuilder>StringBuffer>String
String作为常量,每次更改都创建新对象,性能最低;StringBuilder没有StringBuffer身上的锁,因此性能更好。
总结
如果是单线程场景,因为不用考虑线程安全,推荐使用StringBuilder
如果是多线程场景,推荐使用StringBuffer
如果操作的数据不需要改变,使用String即可
来源:https://www.cnblogs.com/bronya0/p/14433310.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
实例讲解Java的Spring框架中的控制反转和依赖注入
![](https://img.aspxhome.com/file/2023/8/76228_0s.jpg)
Java 1.8使用数组实现循环队列
高斯混合模型与EM算法图文详解
![](https://img.aspxhome.com/file/2023/5/61855_0s.jpg)
idea如何配置javafxsdk详细教程
![](https://img.aspxhome.com/file/2023/3/59603_0s.jpg)
c#批量上传图片到服务器示例分享
解决Springboot启动报错:类文件具有错误的版本61.0,应为 52.0
![](https://img.aspxhome.com/file/2023/2/83452_0s.jpg)
Flutter 分页功能表格控件详细解析
![](https://img.aspxhome.com/file/2023/2/104692_0s.gif)
Android中的windowSoftInputMode属性详解
![](https://img.aspxhome.com/file/2023/4/138184_0s.png)
基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源的示例代码
C语言数据结构之二叉树详解
![](https://img.aspxhome.com/file/2023/3/120783_0s.png)
Java结构型设计模式之桥接模式详细讲解
![](https://img.aspxhome.com/file/2023/2/78062_0s.png)
Android按钮单击事件的四种常用写法总结
C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架
![](https://img.aspxhome.com/file/2023/2/105852_0s.png)
Android自定义圆环倒计时控件
![](https://img.aspxhome.com/file/2023/1/123351_0s.gif)
快速搭建Spring Boot+MyBatis的项目IDEA(附源码下载)
![](https://img.aspxhome.com/file/2023/6/84306_0s.png)
Android App将数据写入内部存储和外部存储的示例
java -jar设置添加启动参数实现方法
安卓中出现过的一些容易被忽略的异常整理
Android开发之DrawerLayout实现抽屉效果
![](https://img.aspxhome.com/file/2023/5/85975_0s.png)