字符串StringBuilder、StringBuffer,工具StringJoiner
一、概述
- 字符串在编程过程中十分重要,操作字符串是我们程序员的必备技能,并且在自然语言处理中具有重要地位。
- 我们注意到,String字符串本质是一个常量数组。(jdk1.8以前是字符数组char[],jdk1.8以前是字节数组byte[],详情请见前篇文章:【Java基础——字符串 String】概述、相关方法.)
- 常量字符串String每次使用"new"关键字,都会在堆区创建新的对象,使得内存空间得不到有效地利用。
- 变量字符串StringBuilder应运而生,解决了这个问题,它会直接对对象进行修改而不会生成新的对象。
- StringBuilder 和 StringBuffer几乎拥有String的所有常用方法,我们在这里不做赘述。(如有需要,详情请见前篇文章)
- CharSequence接口代表该接口代表类型为字符串,而String、StringBuilder、StringBuffer均实现了该接口(其关系如下图所示)。
- CharSequence接口拥有三个固有方法,实现该接口的三种字符串类均实现了这些方法:
① 获取指定索引的字符:public char charAt(int index);
② 获取字符串长度:public int length();
③ 截取部分字符串:public CharSequence subSequence(int start, int end);
二、StringBuilder
- StringBuilder具有强大的字符串操作功能,我们可以利用它对字符串进行更好的拼接、重组。
- StringBuilder位于lang包下,可以直接使用,无需导包。
可以看到,StringBuilder继承了AbstractStringBuilder类,而在该类中定义的value(本质)为可变数组,同样为字节数组byte[]。
三、StringBuffer
- StringBuffer主要是为了线程安全而存在的,它具有与StringBuilder相同的功能。
- StringBuffer位于lang包下,可以直接使用,无需导包。
可以看到,StringBuffer同样继承了AbstractStringBuilder类,所以它的本质同样为可变数组。
三、StringBuilder 、StringBuffer相关方法:
- StringBuffer相关方法的使用与StringBuilder 大同小异,这里我们以StringBuilder 为例。
- 我们定义StringBuilder 对象 stringBuilder:
StringBuilder stringBuilder;
1、append
- append 方法用于在字符串尾部追加其他类型的值,如int、char、float、double、long、boolean、char[]、String等,并作为参数传入。
- 不同于concat方法生成新字符串,append会修改原字符串,但它还是可以返回一个修改后的字符串。
在原字符串上做修改:
- append 的用法如下:
StringBuilder stringBuilder = new StringBuilder("I");
stringBuilder.append(new char[] {' ','l','o','v','e'});
stringBuilder.append(" ");
stringBuilder.append('U');
stringBuilder.append(".The dream is not ");
stringBuilder.append(true);
stringBuilder.append(",but the love is.");
stringBuilder.append("\n");
stringBuilder.append(521);
stringBuilder.append(" ");
stringBuilder.append(13.14);
System.out.println(stringBuilder);
运行结果如下:
接收返回的StringBuilder 对象:
StringBuilder stringBuilder = new StringBuilder("He");
StringBuilder myString = stringBuilder.append("llo"); //接收返回的新StringBuilder对象
System.out.println(stringBuilder); //打印原StringBuilder对象
System.out.println(myString); //打印新的StringBuilder对象
运行结果如下:
可以看到,获得了相同的结果。
2、delete
- delete 方法用于删除字串,须指定始末位置的索引,作为参数传入;适用于删除整个范围内的字串。
- 与append类似。它同样会修改原字符串,但它还是可以返回一个修改后的字符串。
- delete 的用法如下:
- delete 的用法如下:
StringBuilder stringBuilder = new StringBuilder("Helabcdefglo");
StringBuilder myString = stringBuilder.delete(3,10);
System.out.println(stringBuilder);
System.out.println(myString);
3、insert
- insert 方法用于在指定位置插入其他类型的值,如int、char、float、double、long、boolean、char[]、String等,适用于在已知索引的情况下插入单个字符。
- 第一个参数为插入位置索引,第二个参数为想要插入的值。
- 与append、delete类似。它同样会修改原字符串,但它还是可以返回一个修改后的字符串。
- insert 的用法如下:
StringBuilder stringBuilder = new StringBuilder("Hello, am Mike. to meet you!");
stringBuilder.insert(6,'I');
stringBuilder.insert(16,"Nice");
运行结果如下:
接收返回的StringBuilder 对象:
StringBuilder stringBuilder = new StringBuilder("I you.");
StringBuilder myString = stringBuilder.insert(2,"love");
System.out.println(stringBuilder);
System.out.println(myString);
运行结果如下:
可以看到,结果相同。
4、setCharAt
- setCharAt 方法用于修改指定位置的字符,适用于在已知索引的情况下修改改单个字符。
- 第一个参数为需修改字符的位置索引,第二个参数为修改后的字符。
- setCharAt是五个方法中,唯一没有返回值的方法,这意味着它只能在原字符串上进行修改。
- setCharAt 的用法如下:
StringBuilder stringBuilder = new StringBuilder("I lova you.");
stringBuilder.setCharAt(5,'e');
System.out.println(stringBuilder);
运行结果如下:
5、deleteCharAt
- deleteCharAt 方法用于删除指定位置的字符,适用于在已知索引的情况下删除单个字符。
- 参数为需修改的字符位置索引为需删除字符的位置索引。
-
- 与append、delete、insert类似。它同样会修改原字符串,但它还是可以返回一个修改后的字符串。
- 与append、delete、insert类似。它同样会修改原字符串,但它还是可以返回一个修改后的字符串。
- deleteCharAt 的用法如下:
StringBuilder stringBuilder = new StringBuilder("I lovae you.");
StringBuilder myString = stringBuilder.deleteCharAt(5);
System.out.println(stringBuilder);
System.out.println(myString);
运行结果如下:
五、StringJoiner
- StringJoiner 位于util包下,所以使用前需要导包,不可直接使用。
- StringJoiner 依赖StringBuilder实现,性能和StringBuilder差不多,同样也是非线程安全的。
- StringJoiner 用于。。。
现在我们来介绍其相关方法:
1、add(CharSequence newElement)
- 可以看到,传入的参数,需实现CharSequence接口(该接口代表类型为字符串),而String、StringBuilder、StringBuffer均实现了该接口,所以均可作为参数传入,并进行处理。
- add 返回值为StringJoine,我们可以接收它,并生成一个新的StringJoiner对象。
- add 的用法如下:
StringJoiner sj = new StringJoiner(",","[","]");
//构建字符串
String str = "I";
StringBuilder strBu = new StringBuilder("Love");
StringBuffer strBf = new StringBuffer("you");
//添加字符串
sj.add(str);
sj.add(strBu);
//添加字符串,并接收返回的StringJoiner对象
StringJoiner mySj = sj.add(strBf);
//打印结果
System.out.println(sj);
System.out.println(mySj);
运行结果如下:
2、merge(StringJoiner other)
- merge 方法用于连接两个StringJoiner 对象,并修改调用该方法的StringJoiner 对象。
- merge 返回值为StringJoine,我们可以接收它,并生成一个新的StringJoiner对象。
StringJoiner sj = new StringJoiner(",","[","]");
//构建字符串
String str = "I";
StringBuilder strBu = new StringBuilder("Love");
StringBuffer strBf = new StringBuffer("you");
//添加字符串
sj.add(str);
sj.add(strBu);
sj.add(strBf);
//连接StringJoiner对象,并接收返回的StringJoiner对象
StringJoiner mySj = sj.merge(sj);
//打印结果
System.out.println(sj);
System.out.println(mySj);
运行结果如下: