第56-57集:StringBuilder和StringBuffer的使用
区分String、StringBuffer、StringBuilder
StringBuilder可变字符串,线程不太安全,但效率高,推荐使用。
StringBuffer可变字符串,线程安全,但效率低,不推荐使用。
String 是不可变字符串,根据实时情况使用,在循环当中不要使用,因为会产生好的没用的字符串。
关于String、StringBuffer、StringBuilder的面试题的回答
StringBuilder效率高,线程不安全,StringBuffer效率低,线程安全。
String是不可变字符串,StringBuilder是可变字符串。(为什么有这样的差异,可以深入源码去解析,比如String类内的 priver final char value[] 等方法的原因。)
如果是简单的声明一个字符串没有后续过多的操作,使用String,StringBuilder均可,若后续对字符穿做频繁的添加,删除操作,或者是在循环当中动态的改变字符穿的长度应该用StringBuilder。使用String会产生多余的字符串,占用内存空间。
方法链
其实就是用return this实现的
StringBuilder扩容原理(很重要)
看源码和视频,笔记说不清,简单来说就是将更大长度的数组建好,然后将原数据copy进来,然后再赋值给引用变量value,原来那个老数组失去value的引用,将被作为垃圾回收。
package com.test056;
public class Test01 {
/**
* 测试可变字符序列,StringBuilder(线程不安全,效率高),StringBuffer(线程安全,效率低)
*
*/
public static void main(String[] args){
StringBuilder sb = new StringBuilder();// 字符数组长度初始为16
StringBuilder sb1 = new StringBuilder(32);// 字符数组长度初始为32
StringBuilder sb2 = new StringBuilder("ABCD");// 字符数组长度初始为4+16=20,后续append这4个字符,value[] = {'a','b','c','d',/u0000,/u0000......}
sb2.append("efg");
sb2.append(true).append(321).append("aaa");//源码中那句return this可以构建方法链
//区分以下两种写法
String two = new String("a");
for(int i = 0;i<1000;i++){
two = two +i;
}
System.out.println(two); //String这段代码一共创建了1002个对象
StringBuilder one = new StringBuilder("a");
for(int i = 0;i<1000;i++){
one.append(i);
}
System.out.println(one);//这样写就只有2个对象
}
}
第58集:数组StringBuilder和StringBuffer的使用常用方法补充
StringBuilder与StringBuffer方属性方法一样,只不过StringBuffer方法前都加synchronized
-
常用方法:
delete
append
reverse
replace
package com.test059;
public class Test059 {
public static void main(String[] args){
StringBuilder sb = new StringBuilder("abcdefgh");
sb.append(true).append("ABC").append('a');//方法链
System.out.println(sb);
sb.delete(3, 5);//删除方法是[start end) 包头不包尾
System.out.println(sb);
sb.replace(3, 5, "Hello");
System.out.println(sb);//替换方法是将[start end) 的字符替换为指定字符
System.out.println(sb.length());
}
}