本文共 2082 字,大约阅读时间需要 6 分钟。
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(); }}结果:103353
转载地址:http://ikosx.baihongyu.com/