3.8 StringBuilder与StringBuffer

我只是一个虾纸丫 提交于 2020-02-24 12:46:52

简介

      StringBuffer和StringBuilder非常类似,均代表可变的字符序列,而且使用方法也一样 。

  • StringBuilder:可变字符序列、效率高、线程不安全
  • StringBuffer:可变字符序列、效率低、线程安全
  • String:不可变字符序列

更改可变字符序列

代码

/**
 * 测试StringBuilder、 StringBuffer,都是可变字符序列
 * 位于java.lang包中
 * @author dxt
 *
 */
public class TestStringBuilder {
	public static void main(String[] args){
		//StringBuilder线程不安全,效率高;StringBuffer线程安全,效率低
		StringBuilder sb = new StringBuilder("abcdefg");
		
		//打印地址
		System.out.println(Integer.toHexString(sb.hashCode()));
		System.out.println(sb);
		//更改可变字符序列sb的第一个字符
		sb.setCharAt(0, 'A');
		System.out.println(Integer.toHexString(sb.hashCode()));
		System.out.println(sb);
	}
}

结果
result
      可以看到两次打印的sb的地址是相同的,即是同一个对象,但其中的内容是不同的,即是可变的字符序列。原因是StringBuilder对象使用char[] 来保存字符序列,而String使用final char[]来保存字符序列。

StringBuilder类中的常用方法

方法:

  • append()
  • reverse()
  • setCharAt()
  • insert()
  • delete()

代码:

/**
 * 测试一些StringBuilder中的一些方法
 * @author dxt
 *
 */
public class TestStringBuilder2 {
	public static void main(String[] args){
		StringBuilder sb = new StringBuilder();
		//构造一个26个英文字母的字符序列
		for(int i=0; i<26; i++){
			char temp = (char)('a' + i);
			sb.append(temp);	//1. 在字符串后添加字符
		}
		System.out.println(sb);
		//2. 倒序
		sb.reverse();
		System.out.println(sb);
		//3. 更改对应索引的字符
		sb.setCharAt(0, 'A');
		System.out.println(sb);
		//4. 在指定位置插入字符,返回自己
		sb.insert(0, "Z");
		System.out.println(sb);
		//5. 删除一定区间的字符
		sb.delete(0, 2);
		System.out.println(sb);
		//6. StringBuilder 也有String中一些类似的方法
		System.out.println(sb.charAt(0));
		System.out.println(sb);
	}
}

测试可变字符序列和不可变字符序列使用时的陷阱

代码:

/**
 * 测试可变字符序列和不可变字符序列使用时的陷阱
 * @author dxt
 *
 */
public class TestStringBuilder3 {
	public static void main(String[] args){
		//1. 使用String进行字符串的拼接
		String str = "";
		//循环5000次,每一次循环都会舍弃之前的str对象,创建一个新的str对象,同时会将i转为对象
		for(int i=0; i<5000; i++){
			str = str + i;	//会产生10000个对象
		}
		//2. 对以上代码进行修改,使之合理
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<5000; i++){
			sb.append(i);
		}
	}
}

      进行字符串的循环累加操作时,一定不要使用String。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!