一、String 和 StringBuilder、StringBuffer的区别一:string是不可变序列,StringBuilder和StringBuffer是可变序列。
1、而StringBuilder和StringBuffer(都继承于同一个抽象父类AbstractStringBuilder)之间的区别是:StringBuilder线程不安全,效率高,一般用于局部变量。StringBuffer是线程安全效率低。
二、StringBuilder的用法
1、当用new关键字实例化一个StringBuilder:
(1)StringBuilder str = new StringBuilder();//其实在StringBuilder的源码中默认是创建了一个长度为16的数组(可变)。
(2)StringBuilder str = new StringBuilder(int capacity);//其初始容量为capacity(可变)
(3)StringBuilder str = new StringBuilder(String str);//初始化为指定的字符串内容,容量为字符串长度+16(可变)
例1:
<span style="white-space:pre"> </span>StringBuilder str1 = new StringBuilder("abc");//容量为数组长度+16,也就是19,内部创建的数组为 value = {'a','b','c','\u0000','\u0000','\u0000','......'}
2、StringBuilder中常用的方法。
append()方法:
(1)接着上面的例1:str1.append("def");//上面的str1就改变了序列
(2)str1.append(true);//把true当场字符串添加到后面
(3)str.append(true);append("ghi");append("可变序列");//就会将字符创一直累加到StringBuilder中
3、StringBuilder中的循环——StringBuilder中append()方法内部机制:
StringBuilder str2 = new StringBuilder("a"); for (int i = 0; i < 1000; i++) { str2.append(i); } System.out.println(str2);上面的例子输出结果很明显:a01234.....9999
这段循环代码中一共有两个对象,一个是字符串“a”本身,第二个对象是就是Str2实例化出来的StringBuilder。如果是String数组对象的话每循环一次就是一个对象。
而for循环体只是反复修改str2中的数组内容,如果数组超出初始数组长度+16的容量时, append()方法内部就可以扩容【(初始数组长度+16)*2+2】,依次扩容直到长度可以装下a01234.....999(每扩容一次就创建一个新数组,把老的数组回收)。
4、StringBuilder中的其他常用方法:
(1)delete(int start , int end)删除指定位置长度的数组:
StringBuilder str3 = new StringBuilder("abcdefghij"); System.out.println(str3.length()); str3.delete(3, 5);//删除了de,包含开始但不包含尾 System.out.println(str3); System.out.println(str3.length());输出结果是:
10
abcfghij
8
(2)capacity();//返回当前容量
(3)charAt(int index);//返回此序列中指定索引处的 char
值,就是相当于数组的下标。
(4)deleteCharAt(int index);// 移除此序列指定位置上的char
。
(5)indexOf(String str);//返回第一次出现的指定子字符串在该字符串中的索引。
(6)replace(int start,int end,String str);// 给指定位置替换字符串。
......
三、StringBuilder和StringBuffer的区别
首先StringBuilder和StringBuilder方法上的使用是没有任何区别的,在StringBuffer中方法中都有关键字:synchronized(同步的)涉及到多线程问题,不经常用到,所以是线程安全的,效率低。
四、StringBuilder的用途之解决算法题
例如:把abcd......s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
public class Test { public static void main(String[] args) { String str = "abcdefghijklmnopqrs"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < 106; i++) { sb.append(str);<span style="white-space:pre"> </span>//拼接106次str字符串得到长度为2014的字符串 } System.out.println(sb.length());<span style="white-space:pre"> </span>//输出要处理的字符串的长度 while(sb.length()!=1){<span style="white-space:pre"> </span><span style="color:#ff0000;">//直到删除空字符,剩下一个字符时结束循环</span> for (int i = 0; i < sb.length(); i+=2) { sb.setCharAt(i, '\0');<span style="white-space:pre"> </span><span style="color:#ff0000;">//让奇数位置上的字符赋值为空(\0为空字符),因为StringBuilder是可变序列,不能直接删除奇数位置上的字符</span> } for (int i = 0; i < sb.length(); i++) { if(sb.charAt(i)=='\0'){ sb.deleteCharAt(i);<span style="white-space:pre"> </span><span style="color:#ff0000;">//删除空字符,字符串长度变为一半</span> } } } System.out.println(sb.toString());<span style="white-space:pre"> </span>//输出最后一个字符 } }
输出结果为:
2014
q