拼接字符串新姿势—StringJoiner,三年经验Java开发面经总结


StringJoiner 是 java.util 包中的一个类,用于构造一个由分隔符分隔的字符串,并且可以从提供的前缀字符串开头,以提供的后缀字符串结尾。虽然这些功能,我们可以使用 StringBuilder 或者 StringBuffer 来实现的, 但是 StringJoiner 提供的方法更简单,而且也不需要写大量的代码就能成。

构造函数


StringJoiner 一共有 2 个构造函数。 构造函数很简单,就是对 分隔符,前缀和后缀字符串的初始化。

public StringJoiner(CharSequence delimiter) {

this(delimiter, “”, “”);//默认前缀和后缀为"",重载调用

}

public StringJoiner(CharSequence delimiter,

CharSequence prefix,

CharSequence suffix) {

//间隔符,前缀和后缀判断是否为null,null将抛出异常

Objects.requireNonNull(prefix, “The prefix must not be null”);

Objects.requireNonNull(delimiter, “The delimiter must not be null”);

Objects.requireNonNull(suffix, “The suffix must not be null”);

//成员变量赋值

this.prefix = prefix.toString();

this.delimiter = delimiter.toString();

this.suffix = suffix.toString();

//空值被设置为只有前后缀

this.emptyValue = this.prefix + this.suffix;

}

用法


StringJoiner 的用法其实很简单,来,我们看一下 StringJoiner 字符串拼接的用法。

public class StringJoinerTest {

public static void main(String[] args) {

StringJoiner sj = new StringJoiner(“hello”);

sj.add("Java 8 ");

sj.add(“Java 11”);

System.out.println(sj.toString());

StringJoiner sj1 = new StringJoiner(":","[","]");

sj1.add(“Java8”).add(“Java11”).a

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

dd(“Java15”);

System.out.println(sj1.toString());

}

}

输出结果:

Java 8 helloJava 11

[Java8:Java11:Java15]

注意:

  1. 当我们使用StringJoiner(CharSequence delimiter)初始化一个StringJoiner的时候,这个delimiter其实是分隔符,并不是字符串的初始值。

  2. StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)的第二个和第三个参数分别是拼接后的字符串的前缀和后缀。

源码分析


JDK8中源码

public StringJoiner setEmptyValue(CharSequence emptyValue) {

this.emptyValue = Objects.requireNonNull(emptyValue,

“The empty value must not be null”).toString();

return this;

}

@Override

public String toString() {

if (value == null) {

return emptyValue;

} else {

if (suffix.equals("")) {

return value.toString();

} else {

int initialLength = value.length();

String result = value.append(suffix).toString();

value.setLength(initialLength);

return result;

}

}

}

public StringJoiner add(CharSequence newElement) {

prepareBuilder().append(newElement);

return this;

}

public StringJoiner merge(StringJoiner other) {

Objects.requireNonNull(other);

if (other.value != null) {

final int length = other.value.length();

StringBuilder builder = prepareBuilder();

builder.append(other.value, other.prefix.length(), length);

}

return this;

}

private StringBuilder prepareBuilder() {

if (value != null) {

value.append(delimiter);

} else {

value = new StringBuilder().append(prefix);

}

return value;

}

public int length() {

return (value != null ? value.length() + suffix.length() :

emptyValue.length());

}

JDK11中源码

public final class StringJoiner {

private String[] elts;

@Override

public String toString() {

final String[] elts = this.elts;

if (elts == null && emptyValue != null) {

return emptyValue;

}

final int size = this.size;

final int addLen = prefix.length() + suffix.length();

if (addLen == 0) {

compactElts();

return size == 0 ? “” : elts[0];

}

final String delimiter = this.delimiter;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值