持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
在我们使用Java的过程中,经常会进行对字符串的一个操作,那么我们看一下java中操作字符串都有那些类,它们之间有什么区别?
三种类
- String
- StringBuffer
- StringBuilder
区别
String、StringBuilder和StringBuffer的区别?
String是final修饰的,不可变,每次对String类型进行修改时,都会产生新的String对象,内存浪费比较大。因为不可变所以线程安全。
StringBuilder可变字符串 方法中没有同步锁所以是非线程安全的 可以直接在字符串对象本身上进行操作。
StringBuffer可变字符串 对其中的方法或者调用的方法加了同步锁所以是线程安全的 可以直接在字符串对象本身上进行操作。
性能:StringBuilder>StringBuffer>String
选择
字符串少量修改:String
单线程频繁修改字符串:StringBuilder
多线程使用共享变量时使用StringBuffer
下面通过代码看一下三者对于字符串拼接所体现出来的效率问题 代码如下
public class stringq {
public static void main(String[] args) {
StringTest(10000);
StringBufferTest(10000);
StringBuilderTest(10000);
}
public static void StringTest(int n){
String str = "";
Long startTime = System.currentTimeMillis();
for(int i=0;i<n;i++){
str += i;
}
Long endTime = System.currentTimeMillis();
System.out.println("String 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
}
public static void StringBufferTest(int n){
StringBuffer str = new StringBuffer();
Long startTime = System.currentTimeMillis();
for(int i=0;i<n;i++){
str.append(i);
}
Long endTime = System.currentTimeMillis();
System.out.println("StringBuffer 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
}
public static void StringBuilderTest(int n){
StringBuilder str = new StringBuilder();
Long startTime = System.currentTimeMillis();
for(int i=0;i<n;i++){
str.append(i);
}
Long endTime = System.currentTimeMillis();
System.out.println("StringBuilder 连接"+ n +"次消耗"+(endTime-startTime)+"ms");
}
}
我们可以清楚的看到String的字符串的连接效率是最低的,这一点对于大量字符串的拼接可以很明显的表示出来,所以说大量字符串的拼接最好不要选择String。StringBuffer和StringBuilder对于字符串的拼接效率是大致相同的。