- java.lang.StringBuilder:
- 专门用来修改String的一个API,内部维护一个可变的char数组,修改都是在这个数组上进行的,内部会自动扩容
- 修改速度和性能开销优异,并且提供了修改字符串的常见操作对应的方法
- 增:append();
- 删:delete();
- 改:replace();
- 插:insert();
String str = "我爱java";
//修改字符串用StringBuilder
//内存里是一个新开辟的char数组对象
StringBuilder builder = new StringBuilder(str);
- append();-----------------增:追加内容
builder.append(",嘿嘿!");
//可以得到builder的内容,是一个char数组
System.out.println(builder); //我爱java,嘿嘿!
System.out.println(str); //我爱java,注:原字符串内容没有变化
/**
*通过调用builder.toString()方法将builder内容以字符串形式返回
*builder.toString(),在堆里开辟了一个新的内存,存放对象,把它的地址交给str
*原字符串的对象就没有指向了,str指向新的字符串对象
*
*注:str接收新地址后,原对象就没有地址了称为垃圾
*
*/
str = builder.toString();
System.out.println(str); //我爱java,嘿嘿!
- delete();------------------删:删除部分内容
builder.delete(0,start-1);
System.out.println(builder); //,为了改变世界!
deleteCharAt(int i);删除一个字符
- replace();----------------改:替换/修改内容
/**
* 好好学习,嘿嘿!
* 好好学习,为了改变世界!
* replace替换
* 内部维护一个可变的char数组,修改都是在这个数组上进行的,内部会自动扩容,
*/
int start = str.indexOf(",")+1; //含头
int end = str.indexOf("!"); //不含尾
builder.replace(start,end,"为了改变世界");
str = builder.toString();
System.out.println(str); //我爱java,为了改变世界!
- insert();-------------------插:插入
builder.insert(0,"活着");
System.out.println(builder); //活着,为了改变世界!
- reverse();-----------------反转
builder.reverse();
System.out.println(builder); //!界世变改了为,着活
- StringBuilder线程不安全的
public static void main(String[] args) {
//StringBuilder扩容,一次扩容一段,不是追加一个扩容一个
//这样字符串修改的性能,就大大增加了,不会像String 每修改一次 创建一个对象而导致内存溢出
StringBuilder sb = new StringBuilder("av");
for(int i=0;i<10000000;i++){
sb.append("1");
}
System.out.println("over");
/*
+拼接字符串其实就是追了append,编译器在编译的时候,看见有+拼接字符串了
就会自动将拼接内容改为如下内容,所以偶尔用一次+拼接是无关紧要的,但是大量数据的时候
就不可以了,+一次创建一个对象,会导致内存溢出
String s = "a";
for(int i=0;i<1000000;i++){
s = s +"a";
//其实就是 s = new StringBuilder(s).append("a").toString();
}
System.out.println("over");
*/
}