java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删
很多方法和 String 相同,但 StringBuffer 是可变长度的
StringBuffer 是一个容器
注意:
StringBuffer的构造器
// Constructor and Description
StringBuffer()
// 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符
StringBuffer(CharSequence seq)
// 构造一个字符串缓冲区,包含与指定的CharSequener相同的字符
StringBuffer(int capacity)
// 构造一个其中不带字符,但具有指定初始容量的的字符串缓冲区,即对char[]大小进行指定
StringBuffer(String str)
//// 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
String s = "hello";
方式一:
StringBuffer b1 = new StringBuffer(s);
方式二:
StringBuffer b2 = new StringBuffer();
b2.append(s);
方式一:
String s2 = b1.toString()
方式二:
String s3 = new String(b1);
StringBuffer append() // 增
StringBuffer delete(int start, int end) // 删
StringBuffer insert() // 插入
StringBuffer replace(int start, int end, String str) // 改
int indexOf(String str) // 查
int length() // 获取长度
练习题
String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str); // 调用的AbstractStringBuilder的 appendNull方法
System.out.println(sb.length()); // 4 null --> value = {'n', 'u', 'l', 'l'}
System.out.println(sb.capacity()); // 16
System.out.println(sb);
StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16);
System.out.println(sb1);
注意:
StringBuilder 是 final 类,不能被继承
继承了 AbstractStringBuilder,属性 Char[ ] value,因此字符序列是在堆中
实现了 Serialzable 接口,序列号(所谓序列号即可以保存类型和数据本身)
StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,且方法也一样
String 不可变字符序列,效率低,但是复用率高
StringBuffer:可变字符序列,效率较高(增删)、线程安全
StringBuilder:可变字符序列,效率最高,线程不安全
String 使用注意说明:
String s = "a"; // 创建一个字符串
s += "b";
/*
实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串是 s + "b" (即"ab")。如果多次执行这些改变串内容的操作,会导致的大量副本字符串对象存在内存中,降低效率。如果这样的操作放到循环中,会极大的影响程序的性能
==> 结论:如果我们对String做大量修改,不要使用String
*/
long startTime = 0L;
long endTime = 0L;
// StringBuffer
StringBuffer stringBuffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
stringBuffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
// StringBuilder
StringBuilder stringBuilder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
stringBuilder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
//String
String text = "";
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text += i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
// StringBuffer的执行时间:5
//StringBuilder的执行时间:2
//String的执行时间:1463
// 测试结果:StringBuilder > StringBuffer > String
使用的原则、结论:
如果字符串存在大量的修改操作,一般使用StringBuffer 和 StringBuilder
如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder
如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer
如果字符串很少修改,被多个对象引用,使用 String,比如配置信息等
手机扫一扫
移动阅读更方便
你可能感兴趣的文章