StringJoiner源码解读

  • StringJoiner类通常用于分隔符拼接字符串
  • 在java.util包下,
  • 被final修饰的类,不可继承,不可修改
  • 五个成员变量
    - final String prefix #前缀
    - final String delimiter #分隔符
    - final String suffix # 后缀
    - StringBuilder value #初始化值用,value值一直都是包含前缀和add的值,
    - String emptyValue #newStringJoiner(delimiter)方法和toString()方法用保存后缀及toString后缀赋值
  • 构造方法 : 两个
    - StringJoiner(CharSequence delimiter) # 调用this(delimiter, “”, “”)构造方法
    - StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix) # 1判空,2,赋值,
public StringJoiner(CharSequence delimiter,
                        CharSequence prefix,
                        CharSequence suffix) {
        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");
        // make defensive copies of arguments
        this.prefix = prefix.toString();
        this.delimiter = delimiter.toString();
        this.suffix = suffix.toString();
        this.emptyValue = this.prefix + this.suffix;
    }
  • add(CharSequence newElement)方法# 特意查了下CharSequence 和String的区别:CharSequence的值是可读可写序列,而String的值是只读序列。CharSequence是一个接口,不能用new进行实例化,但是可以用下边的方法进行来进行实例化:CharSequence mCharSequence=“ban”;
public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
  • prepareBuilder()方法#add()方法调用了prepareBuilder方法,用于每次增加一个分隔符,之后再append参数的值,prepareBuilder方法主要是初始化value和append分隔符,
private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }
  • 我们看到prepareBuilder方法中,如果value为空,则new StringBuilder(),而StringBuilder()构造方法调用了AbstractStringBuilder(int capacity) {value = new char[capacity]; }的初始化方法,实则创建了一个容量为16的字节数组。所以StringJoiner的底层就是字节数组实现的,内部就是一个StringBuilder。
  • length()方法#
public int length() {
        // Remember that we never actually append the suffix unless we return
        // the full (present) value or some sub-string or length of it, so that
        // we can add on more if we need to.翻译(//*请记住,除非返回完整(当前)值或其子字符串或长度,
        否则我们不会实际附加后缀,以便在需要时添加更多后缀。*)
        return (value != null ? value.length() + suffix.length() :
                emptyValue.length());
    }
  • setEmptyValue(CharSequence emptyValue)方法:当StringJoiner是空的时候,调用这个方法可以设置emptyValue,我们看过StringJoiner(CharSequence delimiter, CharSequence prefix,CharSequence suffix)
    中会设置emptyValue = this.prefix + this.suffix;emptyValue 包含了前缀加上后缀。这里如果只初始化而没有add方法,是否也可以调用这个方法,
    看了下方法说明做了下测试,设置emptyValue只有不调用add方法的情况下,输出StringJoiner才会显示setEmptyValue的值,只要调用了add方法,即使add了一个空值,emptyValue也会失效,这里看下toString()方法就明白了了,只有value为空的情况才会返回emptyValue的值。其他都会返回value值或者value值加上后缀;
public StringJoiner setEmptyValue(CharSequence emptyValue) {
        this.emptyValue = Objects.requireNonNull(emptyValue,
            "The empty value must not be null").toString();
        return this;
    }
  • merge(StringJoiner other)方法:这个平时没怎么用过,看了下方法上面的注释,
    merge首先会调用prepareBuilder()创建一个StringBuilder,然后利用StringBuilder的append方法,把other的值追加到StringBuilder中,append(CharSequence s, int start, int end)方法参数,第一个是值,第二个start是从s值的哪个位置开始,end指截取到多少,相当于other.substring(1,13)
public StringJoiner merge(StringJoiner other) {
        Objects.requireNonNull(other);
        if (other.value != null) {
            final int length = other.value.length();
            // lock the length so that we can seize the data to be appended
            // before initiate copying to avoid interference, especially when
            // merge 'this'
            StringBuilder builder = prepareBuilder();
            builder.append(other.value, other.prefix.length(), length);
        }
        return this;
    }
  • toString()方法
@Override
    public String toString() {
        if (value == null) {
            return emptyValue;//如果value为空,说明可能只是初始化过
        } else {
            if (suffix.equals("")) {
                return value.toString();//后缀为空,直接返回value
            } else {
                int initialLength = value.length();
                String result = value.append(suffix).toString();
                // reset value to pre-append initialLength #**这里重新设置length,是否toString的length不包含后缀长度呢**
                value.setLength(initialLength);
                return result;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值