由于String的不可更改特性,为了方便字符串的修改,java中又提供了StringBuilder类和StringBuffer类。
一、StringBuffer类
StringBuffer的应用
StringBuffer在字符串的操作上克服了String拼接会产生多个对象的问题。它可以以一个字符串作为参数进行初始化。其常用初始化方式有如下三种:
StringBuffer strBuffer=new StringBuffer(); //无参构造函数初始化
StringBuffer stringBuffer=new StringBuffer("123"); //使用字符串对象初始化
StringBuffer stBuffer=new StringBuffer("strBuffer"); //使用另一个StringBuffer对象初始化
1. 字符串拼接插入
StringBuffer只要使用append()方法进行字符串的拼接操作,同时,也可以使用insert()方法有针对性地进行插入。在操作完成之后,可以使用toString方法返回字符串对象。
public class MyStringBuffer {
//StringBuffer的字符串拼接插入
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("Hello"); //初始化StringBuffer对象
System.out.println(stringBuffer);
//追加操作
stringBuffer.append(" StringBuffer!");
System.out.println(stringBuffer);
//插入操作
stringBuffer.insert(6,"Java"); //在索引6位置插入字符
System.out.println(stringBuffer);
}
}
//运行结果
//Hello
//Hello StringBuffer!
//Hello Java StringBuffer!
StringBuffer的append()方法可以追加任何类型的值,并将之转换成字符串添加到StringBuffer对象的末尾。StringBuffer将boolean类型的变量的值当成是字面量追加到末尾,而其他类型则当成一个字符进行追加。
StringBuffer的insert方法可以在指定位置插入传入的值,insert也会将boolean类型的变量以字面量值插入到指定索引位置,该索引位置的值依次向后移动。
2.字符串修改
相较于字符串类,StringBuffer不仅可以拼接字符串或者在特定的位置插入字符串,还可以删除指定索引上的字符。
public class MyStringBuffer {
//StringBuffer的常用操作方法
public static void main(String[] args) {
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("The StringBuffer Search Demo."); //给StringBuffer添加数据
System.out.println(stringBuffer);
System.out.println(stringBuffer.charAt(4)); //输出索引4位置上的数
System.out.println(stringBuffer.indexOf("Search")); //输出Search字符串的索引位置
System.out.println(stringBuffer.indexOf("S",9)); //从索引位置9开始寻找下一个S搜在的索引位置
System.out.println(stringBuffer.delete(4,16)); //删除索引4到索引16位置上的字符
System.out.println(stringBuffer.deleteCharAt(2)); //删除索引位置7上的字符
System.out.println(stringBuffer.lastIndexOf("e")); //输出最后一个e的索引
System.out.println(stringBuffer.replace(0,2,"What a")); //用What a代替索引位置0-2上的元素
System.out.println(stringBuffer.reverse()); //将StringBuffer内的数据进行反转
System.out.println(stringBuffer);
}
//运行结果
//The StringBuffer Search Demo.
//S
//17
//17
//The Search Demo.
//Th Search Demo.
//12
//What a Search Demo.
//.omeD hcraeS a tahW
//.omeD hcraeS a tahW
StringBuffer中的delete方法能够很灵活地删除字符串中的数据,配合insert()方法可以快速实现字符串的修改操作。从输出结果可以看出,StringBuffer对象的修改是持久的。StringBuffer不仅可以很灵活的找到、删除、输出某个指定索引位置的值,还可以很好的实现用某个字符串替换原有的字符串。
但是,StringBuffer对于字符串的操作是“含头不含尾”的处理方式。在替换索引位置0-2的操作里,只替换了索引位置0-1的元素。
二、StringBuilder类
StringBuilder也是官方API中设计的用来操作字符串的方法类,下面让我们通过这个代码一起学习一下吧!
public class MyStringBuilder {
public static void main(String[] args) {
StringBuilder stringBuilder=new StringBuilder(); //初始化一个StringBuilder对象
stringBuilder.append("Hello Java StringBuilder!"); //在末尾追加字符串
System.out.println(stringBuilder.append("!!")); //追加字符!!
System.out.println(stringBuilder.indexOf("Java")); //打印Java第一次出现的索引位置
System.out.println(stringBuilder.delete(6,10)); //删除索引位置6-10的元素
System.out.println(stringBuilder.reverse()); //将StringBuilder里的元素反转
System.out.println(stringBuilder.deleteCharAt(0)); //删除0号索引位置上的元素
System.out.println(stringBuilder);
}
}
//运行结果:
//Hello Java StringBuilder!!!
//6
//Hello StringBuilder!!!
//!!!redliuBgnirtS olleH
//!!redliuBgnirtS olleH
//!!redliuBgnirtS olleH
从上面的代码以及运行结果可以看出,StringBuffer和StringBuilder在一些常用方法上几乎一致,既然功能相同,那为什么要设置两个类呢?
三、StringBuilder和StringBuffer的区别
StringBuffer是多线程(可以理解为一个跑道就是一个线程,多个选手同时在多个跑道比赛就相当于多线程场景)的,StringBuffer采用同步处理,属于线程安全操作,而StringBuilder未采用同步处理,属于线程不安全操作。在编写程序时如果不需要考虑多线程环境,那么就用StringBuilder,因为无需考虑多线程时,不需要担心选手是否会进错跑道,速度就会快一些。