Java平台提供了三个类:String、StringBuffer、StringBuilder,它们可以储存和操作字符串,即包含多个字符的字符数据
-
String
1.String是final类,也即意味着String类不能被继承2.String是字符串常量,即String对象一旦创建就不可更改,有句话是这么说的
对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
如:
String str=“abc”;
System.out.println(str);
str=str+“de”;
System.out.println(str);
这里是产生了两个字符串"abc"和"abcde"
3.String类重写了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer与StringBuilder没有实现,所以用equals方法比较StringBuffer或StringBuilder对象会返回false
4.String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题
- StringBuffer
StringBuffer是可变字符串,同时也是线程安全的 - StringBuilder
StringBuilder也是可变字符串,但是线程不安全 - 三者之间的效率比较
综上所述,String的效率应该是最慢的,因为每次对String类的修改都会产生新的对象。
理论上StringBuilder的效率应该比StringBuffer块,因为StringBuffer中很多方法带有synchronized关键字
通过代码具体比较一下
public class StringTest {
public static void string(){
String str="";
for (int i=0;i<100000;i++){
str=str+i;
}
}
public static void stringBuffer(){
StringBuffer str=new StringBuffer("");
for (int i=0;i<100000;i++){
str.append(i);
}
}
public static void stringBuider(){
StringBuilder str=new StringBuilder("");
for (int i=0;i<100000;i++){
str.append(i);
}
}
public static void main(String [] args){
long time1= new Date().getTime();
string();
long time2= new Date().getTime();
System.out.println(time2-time1);
}
}
准备了三个拼接字符串的方法,分别是String、StringBuffer、StringBuilder
对比一下他们拼接从0到100000所需要的时间
首先是String类 32092毫秒
StringBuffer 30毫秒
差距有点大了
StringBuilder类 32毫秒
这是为什么???
StringBuilder不是应该比StringBuffer快的吗?