StringBuffer
- StringBuffer 的直接父类位AbstracStringBuilder;AbstracStringBuilder实现了 Srrializable,即String Buffer的对象可以串行化
- 再父类中AbstracStringBuilder 有属性 cahr[] value ,不是final该value数组存放字符串内容,引出存放再堆中的
- StringBuffer是一个final类,不能被继承
- 因为StringBuffer而字符串内容是存在char[] value ,所有再变化(增加、删除) 不用每次更换地址,(每次不是创建新的对象)所以效率高于String
- 初始化的时候如果没有指定空间,默认是16
- 新加入的字符都是存在value byte[]下标位
- 当存储的字符数量超过了初始容量,自动扩容
String 与 StringBuffer
- String保存的是字符串常量,里面的值是不能更改的,每次Sring类的更新更新的实际上是更改地址,效率较低(private final char value[];)
- StringBuffer 保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新时间上更新的是内容,不用每次更新地址,效率较高(char [] vlaue)
String与 StringBuffer的相互转化
-
String --> StringBuffer
// 1. 使用构造器,本身对String s1 并没有影响
String s1 = ‘hello’;
StringBuffer s2 = new StringBuffer(s1);
// 2 .append方法
StringBuffer s3 = new StringBuffer(0);
s3 = s3.append(s1);
-
StringBuffer 转 String
- toString方法
StringBuffer s1 = new StringBuffer(“hello”);
String s2= s1.toString();
- new String
String s3 = new String (s1);
StringBuffer 的常见方法
public class Test {
public static void main(String[] args) {
//StringBuffer 的基本使用
StringBuffer stringBuffer = new StringBuffer("hello");
// 增
stringBuffer.append(","); //hello,
stringBuffer.append("李森与gs的奋斗人生,hasugfhisa的撒火凤凰iuhf,啊速度回复");
// 查
int index = stringBuffer.indexOf("ha");//14,查找的是第一位h的位置,从0开始
int index1 = stringBuffer.indexOf("复");//38
System.out.println(index);
// 删
stringBuffer.delete(16,43); // 删除 字符 [16,43)
System.out.println(stringBuffer); //李森的奋斗人生
// 改
stringBuffer.replace(9,11,"高森"); //使用 高森替换 [9,11)字符
System.out.println(stringBuffer);
// 长度
System.out.println(stringBuffer.length());
System.out.println(stringBuffer.indexOf("生")); // 字符位置:16
// 插入
stringBuffer.insert(16,",一定幸福呀!"); //在字符16的位置插入后面的内容
System.out.println(stringBuffer);
}
}
练习
- 练习1
String s = null;
StringBuffer stringBuffer = new StringBuffer(s);
System.out.println(stringBuffer);
// 结果: NULLPointException 空指针异常
- 练习2
String s = null;
StringBuffer s1 = new StringBuffer();
s1.append(s);
System.out.println(s1.length());
// 结果为 4
- 练习3
// 要求:输入一串数字,1214516134.109458,打印1,214,516,134.109458
// 思路: 找到. 的位置,在该位置的前三位数前面insert , 即可,这里判断了两种情况,有无.
String s = "1214516134109458";
StringBuffer sb = new StringBuffer(s);
int index = -1;
index = sb.indexOf(".");
if(index>0){
for(int j= sb.indexOf(".")-3;j>0;j-=3) {
sb.insert(j,",");
}
}
else {
for(int j= sb.length()-3;j>0;j-=3) {
sb.insert(j,",");
}
}
System.out.println(sb);
}
StringBulider
- 一个可变的字符序列。 此类提供一个与String Buffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。该类被设计作用String Buffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候。(单线程,不安全)
- 主要操作是append 和 insert (增加和指定位置插入)
String 、 StringBuilder、 StringBuffer 三者之间的比较
- StringBuilder、 StringBuffer非常相似,均代表科比那字符序列,而且方法也一样
- String: 不可变字符序列,效率低,但是复用性高
- StringBuffer:可变字符序列,效率较高(增删)、线程安全
- StringBuilder:可变字符序列,效率最高、线程不安全
- String的使用: String s = “a”; // 创建了一个字符 String s += “b”; //实际上a字符串已经丢弃,又产生了字符串s+“b”(ab)。多次使用会导致大量副本字符串对象存留在内存中,侠侣降低;结论:如果我们对String大量修改,不要使用String
- 对 String 大量修改:多线程使用StringBuffer ,单线程使用StringBuilder