一、StringBuilder——可变字符串
StringBuilder是一个继承了AbstractStringBuilder的实现类 又称可变字符串
属性:byte[] value(非final修饰)
int count; (此时计数器)
构造器:实际上都用的是父类内的构造方法!
StringBuilder(int) 调用父类方法,传入的是一个Capacity也即核心value的长度
StringBuilder() 同上,只不过默认传入Capacity=16
StringBuilder(String) 仍然同上,传入的虽然是字符串但实际调用过程中是传入父类构造器
一个String的长度+16这样的Capacity
方法:主要是append!
StringBuilder与String最大的区别阅读源码我们会发现在于它的方法往往return this
也就是说它是直接修改本对象并返回的(基于的是内部value[]数组并不是由final限制的,可修改)
而String内部方法如substring、split、concat等都是返回一个新String对象!
也就是说效率上有很大区别
append(Object/String/int/double/boolean......)
基本上来说大同小异,无非是将非String类型的采用String.valueOf(xxx)转化成String
再调用父类的append方法:ensureCapacityInternal(count+str.length())确保capacity够用
最后完成在尾部补充新加str的操作并返回本对象;
亮点在于他能够实现链式增添 append(xx).append(yy).append(zz).......
再者 当需要多次添加重复的对象有且仅有当前Stringbuilder对象和新对象二者!
换用String则要反复新建对象反复清除旧对象 效率低!
StringBuilder sbd = new StringBuilder("HelloWorld");
sbd.insert(3,"Q" ).insert(3, "P");
System.out.println(""+sbd);// HelPQloWorld
sbd.delete(0, 2);//往往角标问题是包头去尾
System.out.println(sbd);// lPQloWorld
sbd.replace(0, 3, "Hel");//HelloWorld
System.out.println(sbd);
sbd.replace(0, 3, "Hello");//HelloloWorld
System.out.println(sbd);
二、StringBuffer
StringBuffer在方法功能和方法实现上基本与StringBuilder一致,但它的特点在于它的方法都加上了Synchronized以添加同步锁机制,确保字符串操作的过程中多线程和谐并发,防止资源抢夺中发生不合法的逻辑!
三、效率比较
String str = "";
StringBuilder sb1 = new StringBuilder();
StringBuffer sb2 = new StringBuffer();
long start = System.currentTimeMillis();
for(int i = 0 ; i < 100000 ; i ++)
{
str += i;
}
long end1 = System.currentTimeMillis();
// Time of String : 13823ms
System.out.println("Time of String : "+ (end1 - start)+"ms");
for(int i = 0 ; i < 100000 ; i ++)
{
sb1.append(i);
}
long end2 = System.currentTimeMillis();
// Time of Builder : 3ms
System.out.println("Time of Builder : "+(end2 - end1)+"ms");
for(int i = 0 ; i < 100000 ; i ++)
{
sb2.append(i);
}
long end3 = System.currentTimeMillis();
// Time of Buffer : 6ms
System.out.println("Time of Buffer : "+(end3 - end2)+"ms");