【Java 基础】字符串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继承关系
可以看到,StringBuilder继承了AbstractStringBuilder类,而在该类中定义的value(本质)为可变数组,同样为字节数组byte[]。

AbstractStringBuilder

三、StringBuffer

  • StringBuffer主要是为了线程安全而存在的,它具有与StringBuilder相同的功能。
  • StringBuffer位于lang包下,可以直接使用,无需导包。
    StringBuffe继承关系r
    可以看到,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

  • 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
  • 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
  • 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
  • setCharAt 的用法如下:
StringBuilder stringBuilder = new StringBuilder("I lova you.");
stringBuilder.setCharAt(5,'e');
System.out.println(stringBuilder);

运行结果如下:
运行结果

5、deleteCharAt

  • deleteCharAt 方法用于删除指定位置的字符,适用于在已知索引的情况下删除单个字符。
  • 参数为需修改的字符位置索引为需删除字符的位置索引。
    • 与append、delete、insert类似。它同样会修改原字符串,但它还是可以返回一个修改后的字符串。
      deleteCharAt
  • 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)

add

  • 可以看到,传入的参数,需实现CharSequence接口(该接口代表类型为字符串),而String、StringBuilder、StringBuffer均实现了该接口,所以均可作为参数传入,并进行处理。
  • add 返回值为StringJoine,我们可以接收它,并生成一个新的StringJoiner对象。

String
StringBuilder
StringBuffer

  • 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

  • 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);

运行结果如下:
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值