目录
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类(用于存储数据的容器)。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
特点
- 长度可变
- 可以存储不同类型的数据
- 最终转成字符串进行使用
- 可以对字符串进行修改
功能
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要快。