总结String,StringBuilder,StringBuffer
字符串历史
String诞生的最早,出生于JDK1.0时代,它属于不可变字符序列 。老二StringBuffer也出生于JDK1.0时代,它比String晚丢丢,其中,它的特点是线程安全的可变字符序列 。老三StringBuilder则出生于JDK1.5时代),比较晚了。它和老大老二的区别是,它是非线程安全的可变字符序列 。
\
具体区别
在Java中,他们的区别表现为:String是一个类,而并非基本数据类型。string是值传入,不是引用传入。这里可能就有很多人误解了,因为String是一个类,当你以下面这种形式进行声明时怎么可能还是值传递呢?
String sr = new String ("AA");
有个大神是这样解释的:String是引用传递,只是传过去后,一般被重新赋值就会改变指向,表现的现象是值传递。证明过程如下:
java.lang.String src ="asdf"; //这里我将src初始化为asdf
int hascode = System.identityHashCode(src);//得到它的储存的哈希地址值,打印输出
System.out.println(hascode);
//当我进行传递后重新赋值并打印地址
src = "123sdf";//src指向了 123df
hascode=System.identityHashCode(src);
System.out.println(hascode);
//结果
1163157884 //上面代码改变前的地址
1956725890//改变后的地址
总结:没一次对String的改变,都会重新生成一个对象,当进行传递时,表现的是值传递,即随着传递方法调用结束后,新生成的引用等都会随着释放,原来的值还是原来的值,并不能改变什么。
对于StringBuffer和StringBuilder,他们两可就算是双胞胎了,首先(1)在线程安全性方面,StringBuffer允许多线程进行字符操作。 这是因为在源代码中StringBuffer的很多方法都用关键字 synchronized 修饰了,我们知道synchronized 是加锁的意思,加了锁就可以防止数据源被污染了。而StringBuilder没有。(2)对字符串做出改变时,他们的地址是不会改变得,即没有生成新对象,具体证明可以参考上面方法进行实施。
因此,如果不考虑线程安全,StringBuilder应该是首选,它的效率比StringBuffer稍高。另外,JVM运行程序主要的时间耗费是在创建对象和回收对象上。