String类型和StringBuilder、StringBuff有本质上的区别:String类型的字符串具有不可变性,它所具有的方法无法修改原来的字符串,只能用新的字符串来接受修改结果,StringBuilder、StringBuff这两种字符串类型,可以对原来的字符串本身进行修改,但StringBuilder和StringBuff也有区别,StringBuilder的方法没有synchronized修饰,所以具有“线程”不安全性,但性能好。而StringBuff的方法有synchronized修饰,所以“线程”安全,但性能差。日常在我们要对字符串进行一些修改操作时,我们不需要考虑“线程”安全,所以我们一般会选择使用StringBuilder类型的字符串。
String s1 = "X";
s1 = s1.concat("a");// 连接字符串,产生新的字符串
System.out.println(s1);
StringBuilder s2 = new StringBuilder("x");
s2.append("a");// 在当前字符串的“尾部追加”字符串
System.out.println(s2);
StringBuffer s3 = new StringBuffer("x");
s3.append("a");// 在当前字符串的“尾部追加”字符串
System.out.println(s3);
图1
如图1中,如果字符串是String类型,想要在原字符串后再加新字符串,只能使用concat()方法将新字符串连接在原字符串后面,并且生成新字符串,但如果使用StringBuilder和StringBuff类型的字符串,则可以直接使用append()方法在当前的字符串尾部直接添加字符串。
String s="abcd";
s.replace("a", "A");
System.out.println(s);//字符仍为原内容
StringBuilder s1=new StringBuilder(s);
s1.replace(1,2, "BC");//将下标1-下标3(不含)的字符串内容替换为"BC"
System.out.println(s1);
图2
如图2中,当字符串为String类型时,因为String类型不可变,所以在replace()方法后,输出原字符串没有发生改变,但当字符串为StringBuilder类型时,使用replace()方法,可以将指定下标范围的内容替换为目标字符串。
StringBuilder s = new StringBuilder();
s.append("如果我是一只鱼").delete(0, 3)// 按照下标范围删除字符串内容
.deleteCharAt(2);// 按照下标删除目标字符
图3
图3中有StringBuilder的append()、delete()、deleteCharAt()方法:
append():该方法是往字符串中继续添加字符串;
delete():该方法是按照下标范围删除字符串的内容
deleteCharAt():该方法是按照下标删除字符
StringBuilder s = new StringBuilder("abcd");
// insert():在指定下标位置,插入“新内容”
s.insert(2, "bbbbb").insert(2, true).insert(2, Math.PI);
// 字符串逆序
StringBuilder s3 = new StringBuilder("abcde");
s3.reverse();
图4
图4中使用StringBuilder的insert()和resverse方法
insert():该方法可以在指定的下标位置,插入“新的内容”。这个方法插入的类型可以是字符串,也可以是其他数据类型。
reverse():该方法可以实现字符串的逆序。