String、StringBuilder和StringBuffer
String类
当一个字符串用String定义的时候,如果需要改变(删除或添加)新的字符串,则需要创建一个新的对象,然后再进行添加和修改。
public class TestString{
public static void main(String[] args){
String str = new String("我的祖国");
String str2 = new String("我爱");
System.out.println(str2+str);
}
}
StringBuffer和StringBuilder
如果一个字符串用StringBuilder和StringBuffer定义的时候,在添加和修改字符串则不需要创建一个新的对象,直接进行添加和修改即可。
public class TestStringBuffer{
public static void main(String[] args){
StringBuffer sb = null;
sb = new StringBuffer("liu");
sb.append("123");
sb.append("456");
System.out.println(sb);
}
}
运行结果:gao123456
该代码略微有一点繁琐,可以直接创建一个对象,然后直接定义。例如:
public class TestBuffer{
public static void main(String[] args){
StringBuffer sb = new StringBuffer("liu");
sb.append(123);
sb.append(456);
Ststem.out.println(sb);
}
}
上面两种代码书写的方式不一样,但是意义相同,都是给原本的对象中的字符串添加相应的字符串。
tips
StringBuffer中可以直接写sb.append("liu").append("123").append("456");
例如:
StringBuffer sb = new StringBuffer("liu");
sb.append("123").append("456").append("789");
System.out.println(sb);
运行结果:liu123456789
为什么StringBuffer和StringBuilder可以直接连续进行修改字符串?
上面的两张截图是StringBuffer的源代码,可见每一次的创建的新的方法都是返回的this原来的对象,而String则不是这样,因此由于每一次都返回的同一个对象,也可以直接在后面加append然后添加新的字符串。
StringBuffer的其他应用
1.插入字符串
StringBuffer sb2 = new StringBuffer("我的祖国");
sb2.insert(0,"爱").insert(0,"我"); //插入字符串
System.out.println(sb2);
运行结果:我爱我的祖国
tips:Sb.insert(0,"爱").insert(0,"我");
先从第0处(开始的位置)插入一个字符串“爱”,然后得到新的字符串,再从第0处(开始的位置)插入一个字符“我”,最后则为“我爱我的祖国”。
2.删除字符串
在第1个代码的基础上继续删除字符串
sb2.delete(0,2);
System.out.println(sb2);
运行结果:我的祖国
tips:在第0处(开始的位置)上删除了两个字符,则删除了“我爱”,最后的运行结果就是“我的祖国”。
3.删除获取某个字符串/逆序
在第2个代码块的基础上继续进行删除获取字符串和逆序
sb2.deleteCharAt(0).deleteCharAt(0);
System.out.println(sb2.charAt(0)); //获取某个字符串
System.out.println(sb2.reverse()); //字符串逆序
运行结果:祖
国祖
tips:删除从开始的位置连续两个字符,然后第一行输出的时获取的第0个字符,也就是祖国的祖。第二行reverse是将字符串逆序,然后进行输出。
为什么String类是不可变序列,而StringBuilder和StringBuffer是可变字符序列?
因为在String类的源码中加入了final,意思是不可变的,如果每次更改的话就要创建新的对象。