-
.String、StringBuffer 和StringBuilder的比较
1) StringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
2) String:不可变字符序列,效率低,但是复用率高。
3) StringBuffer:可变字符序列、效率较高(增删)、线程安全,看源码(加锁)
4) StringBuilder:可变字符序列、效率最高、线程不安全
5)String使用说明:
String s = “a”; //创建了一个字符
s +=“b”; //实际上原来的"a"字符串已经丢弃了,现在有产生一个字符串 s+“b”(也就是"ab"),如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。
结论=>如果我们对String做大量的修改,不要使用String。
-
使用的原则,结论:
1.如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder
2. 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
3.如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
4.如果我们字符串很少修改,被多个对象引用,使用String, L比如配置信息等
效率 : StringBuilder > StringBuffer > String(代码演示在最后)
-
StringBuffer
1.StringBuffer的直接父类是AbstractStringBuilder
2.StringBuffer实现了Serializable 即StringBuffer的对象可以串行化
3.在父类中 AbstractStringBuilder 有属性 char[] value,不是final,在该value数组存放字符串内容,引出存放在堆中的
4.StringBuffer 是一个final类 不能被继承
5.StringBuffer是存放在 char[] value ,所有的变化 不用每次创建新对象,更换地址所以效率高于String
StringBuffer 构造器默认为初始化16个字符
StringBuffer的构造器
public class StringBuffer02 {
public static void main(String[] args) {
//构造器的使用
//1.创建一个大小为16的 char[],用于存放字符内容
StringBuffer stringBuffer1 = new StringBuffer();
//2.通过构造器指定char[]大小
StringBuffer stringBuffer2 = new StringBuffer(100); //cahr[100]
//3. 通过 给一个String 创建一个 StringBuffer,char[] 大小就是str.length() +16
StringBuffer stringBuffer3 = new StringBuffer("hello");
}
}
String和StringBuffer相互转换
public class StringAndStringBuffer {
public static void main(String[] args) {
//看String——>StringBuffer
String str = "hello Tom";
//方式一,使用构造器
//注意:返回的才是 StringBuffer 对象,对str 本身没有影响
StringBuffer stringBuffer = new StringBuffer(str);
//方式2使用的是append方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer.append(str);
//看看 StringBuffer-->String
StringBuffer stringBuffer2 = new StringBuffer("hsp");
//方式一:使用 StringBuffer 提供的 toString方法
String s = stringBuffer2.toString();
//方式二:使用构造器
String s1 = new String(stringBuffer2);
}
}
常用方法
1)增append
2)删delete(start,end)
3)改replace(start,end,string)//将start----end间的内容替换掉,不含end
4)查indexOf //查找子串在字符串第1次出现的索引,如果找不到返回-1
5)插insert
6)获取长度length
代码演示
public class StringBufferMethod01 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
//1.增
s.append(',');// "hello,"
s.append("张三丰");//"hello,张三丰
s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏 100true10.5"
s.append("你好").append("world").append(100.2);
System.out.println(s); //"hello,张三丰赵敏 100true10.5
//2.删
/*
* 删除索引为>=start && <end 处的字符
* 解读: 删除 11~14 的字符 [11, 14) 左闭右开
*/
s.delete(11,14);
System.out.println(s); //hello,张三丰赵敏100t10.5你好world100.2
s.delete(0,10);
System.out.println(s);//敏100t10.5你好world100.2
//3.改
// 老韩解读,使用 周芷若 替换 索引 9-11 的字符 [9,11)
s.replace(9,11,"周芷若");
System.out.println(s);//敏true10.5周芷若world100.2
//4.查找指定的子串在字符串第一次出现的索引,如果找不到返回-1
int indexOf = s.indexOf("周芷若");
System.out.println(indexOf); //9
//5.插入
//老韩解读,在索引为 9 的位置插入 "赵敏",原来索引为 9 的内容自动后移
s.insert(9,"周敏");
System.out.println(s);//敏true10.5周敏周芷若world100.2
}
}
-
StringBuilder类
1)一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类因为在大多数实现中,它比 StringBuffer要快。
2)在 StringBuilder上的主要操作是append和 insert方法,可重载这些方法,以接受任意类型的数据。
常用方法同上,这里不再演示。
三者性能比较代码:
public class StringVsStringBufferVsStringBuilder {
public static void main(String[] args) {
long startTime = 0L;
long endTime = 0L;
//StringBuffer
StringBuffer buffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {//StringBuffer 拼接 20000 次
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer 的执行时间:" + (endTime - startTime));
//StringBuilder
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {//StringBuilder 拼接 20000 次 第 566页
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder 的执行时间:" + (endTime - startTime));
//String
String text = "";
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {//String 拼接 20000
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String 的执行时间:" + (endTime - startTime));
}
}
运行结果: