目录
在Java中 String、 StringBuffer、 StringBuilder都是用于处理字符串的类,它们在 性能、线程安全性、不可变性等方面都有明显的区别
一、String类
String是java中表示字符串的类,有两种定义的方式:
(1).引用类型常用的方法,用new方法创建。
String str = new String();
(2).用直接赋值的方式提供(从字符串常量池里面查找,并且返回地址)
String str = "";
String定义的字符串是不可变的,一旦String对象被定义之后,是不可改变的,每一次修改的时候,都会创建一个新的字符串对象
String的特点
1.不可变性:只要是创建之后,就不可以被修改,如果被修改,则是创建的一个新的字符串。
2.性能差:因为字符串不可变,每一次的修改都会重新创建,会导致性能相比于StringBuilder和StringBuffer低很多。
3.多线性安全:因为String不可变,因此多线程安全。
String示例
下面是验证String类不可变的示例,通过先查看str的内存地址,然后进行拼接操作,再查看str的内存地址,并且进行比较。
public class StingDemo {
public static void main(String[] args) {
String str = "he";
String str1 = "0";
System.out.println(System.identityHashCode(str));
str = str+str1;
System.out.println(System.identityHashCode(str));
}
}
通过上面的运行结果,可以看出来,只要是字符串发生改变之后,都会创建一个新的对象,即字符串不可变。
二、StringBuffer类
StringBuffer是一个可变的字符串序列,用它可以实现修改字符串内容。StringBuffer是多线程安全情况下修改字符串。
StringBuffer的特点
(1)可以修改:可以改变对象的内容,但不会重新创建对象。
(2) 线程安全:StringBuffer方法是同步的,适用于多线程安全。
(3)性能相比于StringBuilder差相比于String好很多:由于线程同步的开销,StringBuffer 在单线程环境下的性能不如 StringBuilder。
StringBuffer示例
下面的StringBuffer构建了一个对象,并且调用其中的方法进行修改字符串的操作,由于是调用对象中的方法,因此是可变的。
public class StingDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("a");
sb.insert(1,"b");
sb.append("cde");
System.out.println(sb.toString());
sb.reverse();
System.out.println(sb.toString());
}
}
三、StringBuilder类
StringBuilder 类与 StringBuffer 类唯一的区别是 StringBuilder 不是线程安全的,因此在单线程环境中,StringBuilder 的性能要比 StringBuffer 更高。StringBuilder 在多线程环境下不适用。
StringBuilder的特点
(1)可以修改:可以改变对象的内容,但不会重新创建对象。
(2) 非多线程安全:不适用于多线程环境。
(3)性能最优:由于没有线程同步的开销,StringBuilder在单线程环境表现好。
StringBuilder示例
下面的StringBuilder构建了一个对象,并且调用其中的方法进行修改字符串的操作,由于是调用对象中的方法,因此是可变的。
public class StingDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.insert(1,"b");
sb.append("cde");
sb.append("asfdasf");
System.out.println(sb.toString());
sb.reverse();
System.out.println(sb.toString());
}
}
四、StringBuilder、StringBuffer、String的性能区别
(1)String:每次修改字符串时,都会创建新的对象,因此效率低下,尤其是在循环中大量拼接字符串时,性能会大幅下降。
(2)StringBuffer:提供了线程安全的字符串操作,性能要低于 StringBuilder。
(3)StringBuilder:适用于单线程环境,性能最好。
public class StingDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
StringBuffer sbf = new StringBuffer();
String str = "";
// String
long time1 =System.currentTimeMillis();
for(int i = 0;i<100000;i++){
str+=i;
}
long time2 = System.currentTimeMillis();
System.out.println("String:"+(time2-time1));
// StringBUffer
long time4 =System.currentTimeMillis();
for(int i = 0;i<100000;i++){
sbf.append(i);
}
long time3 = System.currentTimeMillis();
System.out.println("StringBuffer:"+(time3-time4));
// StringBUilder
long time5 =System.currentTimeMillis();
for(int i = 0;i<100000;i++){
sb.append(i);
}
long time6 = System.currentTimeMillis();
System.out.println("StringBuffer:"+(time6-time5));
}
}
通过上述的代码可以看出,当进行大量拼接操作的时候,StringBuffer和StringBuilder的性能比String强很多。