StringBuffer和StringBuilder的功能特点与区别(基础版)

目录

特点

功能

区别


当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类(用于存储数据的容器)。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

 

特点

  1. 长度可变
  2. 可以存储不同类型的数据
  3. 最终转成字符串进行使用
  4. 可以对字符串进行修改

 

功能

public class TestStringBuilder {
	public static void main(String[] args) {
		String str;
		StringBuilder sBuilder=new StringBuilder();//可变字符序列:相比String 无final修饰
		StringBuffer sbBuffer=new StringBuffer("abcdefg");
		//StringBuilder线程不安全,效率高(一般使用它),StringBuffer线程安全,效率低
		 
		System.out.println(Integer.toHexString(sbBuffer.hashCode()));
		System.out.println(sbBuffer);
		
		System.out.println("********");
		//更改字符串的内容
		sbBuffer.setCharAt(2, 'M');
		System.out.println(Integer.toHexString(sbBuffer.hashCode()));//hashcode一样,说明对象没变,
		System.out.println(sbBuffer);
	}

}
 
public class TestStringBuilder2 {
	public static void main(String[] args) {
		StringBuilder sbStringBuilder=new StringBuilder();
		
		for(int i=0;i<26;i++) {
			sbStringBuilder.append((char)('a'+i));//append扩展,可以链式调用
		}
		
		System.out.println(sbStringBuilder);
	
		//reverse 倒序
		sbStringBuilder.reverse();
		System.out.println(sbStringBuilder);
		
		//setCharAt 替换
		sbStringBuilder.setCharAt(3, '可');
		System.out.println(sbStringBuilder);
		
		//insert 插入
		sbStringBuilder.insert(4, '变').insert(5, '的');
		//insert最后会调用return this,返回自己,所以可以链式调用。
		System.out.println(sbStringBuilder);
		
		//delete 删除,和insert一样,可以链式调用
		sbStringBuilder.delete(3, 5).delete(17, 19);
		System.out.println(sbStringBuilder);
	}
}
//{
//	和String类含义类似的方法
//	public int indexOf(String str)
//	public int indexOf(String str,int fromindex)
//	public String substring (int start)
//	public String subString (int start,int end)
//	public int length()
//	char charAt(int index)
//}
/*
 * 测试String和StringBuilder的使用陷阱
 */
public class TestStringBuilder3 {
	public static void main(String[] args) {
		
		//使用String进行字符串的拼接 (!*不能出现这样的代码*!)
		String string="";
		for(int i=0;i<5000;i++) {
			string=string+i;  //相当于产生了10000个对象(i代表的数字为了和string相加,会变成一个字符串对象以和string联结)
		}
		
		//要用StringBuilder的append
		StringBuilder stringBuilder=new StringBuilder();
		for(int i=0;i<5000;i++) {
			stringBuilder.append(i);
		}
	}

}

区别

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

StringBuffer基本上都调用了父类的方法而且都加了synchronized修饰,所以是线程安全的;但是频繁的加锁和释放锁导致性能降低,执行速度上比StringBuffer要慢。
StringBuilder所有方法都没有用synchronized关键字修饰,所以线程不安全,但是由于没有加锁释放锁导的过程,执行速度上比StringBuffer要快。

你可能感兴趣的:(【Java基础】)