java中的StringBuilder类的使用, String、StringBuilder、StringBuffer的区别

时间:2020-12-07 03:56:45

一、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