详解java中String、StringBuilder、StringBuffer的区别

2025-05-29 0 37

你知道StringStringBuilderStringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?

别急,这篇文章带你解决这些问题。

可变性

首先,String是字符串,我们一般这样声明:

?

1
String s = "abc";

String类使用被final修饰的char数组来存储字符串的内容,它的一大特性就是不可变,怎么理解这个不可变呢?

我们知道,一个类被final修饰,那么这个类无法被继承,方法也不能被重写,属性也不能改变。

看看这段代码:

?

1

2

3
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的源码:

?

1

2

3

4

5

6

7

8

9
@Override

public int compareTo(StringBuilder another) {

return super.compareTo(another);

}

@Override

public StringBuilder append(Object obj) {

return append(String.valueOf(obj));

}

再看看StringBuffer的:

?

1

2

3

4

5

6

7

8

9

10

11

12
@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身上的锁,因此性能更好。

总结

  1. 如果是单线程场景,因为不用考虑线程安全,推荐使用StringBuilder
  2. 如果是多线程场景,推荐使用StringBuffer
  3. 如果操作的数据不需要改变,使用String即可

到此这篇关于java中StringStringBuilder、StringBuffer的区别的文章就介绍到这了,更多相关java中StringStringBuilder、StringBuffer的区别内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://www.cnblogs.com/bronya0/p/14433310.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 详解java中String、StringBuilder、StringBuffer的区别 https://www.kuaiidc.com/108383.html

相关文章

发表评论
暂无评论