Java中String、StringBuilder、StringBuffer三者有何本质区别及适用场景?
- 内容介绍
- 文章标签
- 相关推荐
本文共计728个文字,预计阅读时间需要3分钟。
你知道String、StringBuilder、StringBuffer的区别吗?当你创建字符串时,有哪些考量过应该使用哪个?别急,这篇文章将带你解决这些疑问。
可变性首先,String是不可变的,即一旦创建,其内容就不能更改。这意味着每次对String进行修改时,实际上都会创建一个新的String对象。
优先级当需要频繁修改字符串时,优先考虑使用StringBuilder或StringBuffer。
StringString是Java中的基本数据类型,表示不可变的字符序列。通常这样声明:javaString str=Hello;
StringBuilderStringBuilder是可变的,适用于需要频繁修改字符串的场景。它不是线程安全的,但在单线程环境中效率更高。通常这样声明:javaStringBuilder sb=new StringBuilder(Hello);
StringBufferStringBuffer也是可变的,但它是线程安全的,适用于多线程环境。通常这样声明:javaStringBuffer sbuf=new StringBuffer(Hello);
你知道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即可
到此这篇关于java中String、StringBuilder、StringBuffer的区别的文章就介绍到这了,更多相关java中String、StringBuilder、StringBuffer的区别内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计728个文字,预计阅读时间需要3分钟。
你知道String、StringBuilder、StringBuffer的区别吗?当你创建字符串时,有哪些考量过应该使用哪个?别急,这篇文章将带你解决这些疑问。
可变性首先,String是不可变的,即一旦创建,其内容就不能更改。这意味着每次对String进行修改时,实际上都会创建一个新的String对象。
优先级当需要频繁修改字符串时,优先考虑使用StringBuilder或StringBuffer。
StringString是Java中的基本数据类型,表示不可变的字符序列。通常这样声明:javaString str=Hello;
StringBuilderStringBuilder是可变的,适用于需要频繁修改字符串的场景。它不是线程安全的,但在单线程环境中效率更高。通常这样声明:javaStringBuilder sb=new StringBuilder(Hello);
StringBufferStringBuffer也是可变的,但它是线程安全的,适用于多线程环境。通常这样声明:javaStringBuffer sbuf=new StringBuffer(Hello);
你知道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即可
到此这篇关于java中String、StringBuilder、StringBuffer的区别的文章就介绍到这了,更多相关java中String、StringBuilder、StringBuffer的区别内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

