java中,提供了String类型的,因为String不可变的特殊特性,致使每一次都必须创建新的临时字符串对象。不仅浪费内存,还会影响GC(垃圾回收,收集,内存释放)效率。所以系统又为我们提供了两种可变字符串。
1.什么叫可变字符串:
StringBuilder和StringBuffer都是可变字符串(可变对象),即在创建时,系统会为其“预分配缓冲区”,这样往可变字符串中新增对象时,就不需要再创建新的对象。
2.StringBuilder和StringBuffer的区别以及相同点:
区别:StringBuffer线程安全,性能差,因为其在每个方法中都加了一个synchronized锁,导致性能差。(由图所示)
StringBuiler线程不安全,性能好,它并没有在每个方法中都加了一个synchronized锁,所以性能好。
相同点:1.都是可变字符串
2.都继承自AbstractStringBuilder父类(观察源码就可知),且其两个类都是final修饰的,不可被继承。
3.都同属Java.lang下,不需要导包
4.其内部都同设16个字符的预分配缓冲区(下图为StringBuffer的源码)
5.支持链式操作,
//可变字符串的链式操作。
StringBuilder sb1 = new StringBuilder();
sb1.append(true).append("12").append(2);
3.StringBuilder和StringBuffer的使用选择:
面对需要重复创建String对象时,平时我们应该优先选择StringBuilder,因为其高效的性能,
但是,如果注明需考虑线程安全,那么我们必然选择StringBuffer。
4.常使用方法:与String方法一致的不再介绍,详情请参考博主主页的String方法总结,下面对可变字符串的一些特有常用方法做以总结。
1.append():
由源码可知,其方法为重载的。
主要作用,可将不同类型的值,追加至可变字符串的尾部,并返回自身实例本身
2.delete():
delete(起始下标,结束下标)
主要作用:删除指定区间的字符串,并返回实例本身
3.deletecharAt():
deletecharAt( int i)
主要作用:删除可变字符串中指定位置的字符。i>=0并且 i 小于长度。
4.insert()
insert(指定位置下标,添加元素)
主要作用:在指定位置,添加元素内容
5.reverse():无参数
主要作用:反转字符串。