String
String不可变,StringBuffer、StringBuilder可变,还有什么区别?
String:查源码,类的声明是:public final,清楚的知道,fianl是不可改变的。
但是操作字符串的时候,你感觉字符串变长了(改变?)原理是这样的:
String name1 = "Luoce";
String name2 = name1 + " Jack";
字符串变?错!
字符串对象的内容是无法更改的!
反编译这段程序,运行机制其实是:
String s = "Luoce";
String s1 = (new StringBuilder().append(s).append(" Jack").toString());
一旦我们字符串的值改变,内存创建一个新的字符串对象,原来的对象就会变为垃圾被GC回收掉,
非常复杂操作来进行的String拼接
StringBuffer、StringBuilder的区别
所以,涉及到字符串操作的,我们一般使用StringBuffer或者StringBuilder,两者有什么区别
StringBuffer和StringBuilder都集成了AbstractStringBuilder,
而StringBuffer大部分方法都是synchronized,线程安全,
但是StringBuilder没有,线程不安全。
而且因为线程安全的提升,牺牲的运行速度。因为StringBuffer要维持同步锁,这肯定要消耗部分资源。
总结
运行速度:StringBuilder > StringBuffer > String
Stirng:不可变
StringBuffer线程不安全,StringBuffer线程安全
写个Demo测试速度差异
package demo;
/**
* String、StringBuffer、StringBuilder速度测试比较
* @author SYFC
*/
public class StringStringBufferStringBuilderTest {
/**
* string速度
*/
public void stringTest(){
long startTime = System.currentTimeMillis();
String str = null;
for (int i = 0; i < 20000; i++) {
str = str + i +",";
}
System.out.println(System.currentTimeMillis()-startTime);
}
/**
* StringBuffer速度
*/
public void stringBuffer(){
long startTime = System.currentTimeMillis();
StringBuffer strBuffer = new StringBuffer();
for (int i = 0; i < 20000; i++) {
strBuffer.append(i+",");
}
System.out.println(System.currentTimeMillis() - startTime);
}
/**
* StringBuilder速度
*/
public void stringBuilder(){
long startTime = System.currentTimeMillis();
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < 20000; i++) {
strBuilder.append(i+",");
}
System.out.println(System.currentTimeMillis()-startTime);
}
/**
* 测试
*/
public static void main(String[] args) {
StringStringBufferStringBuilderTest test = new StringStringBufferStringBuilderTest();
test.stringTest();
test.stringBuffer();
test.stringBuilder();
}
}
结果:
1033
5
3