美文网首页
StringJoiner源码阅读

StringJoiner源码阅读

作者: cocalrush | 来源:发表于2017-04-28 00:17 被阅读0次

StringJoiner源码阅读

昨天看到一个非常有意思的类StringJoiner。 今天就来看下是怎么实现的。大概看了下,仍然是基于StringBuilder实现的。(昨天首先想到的是StringBuffer...这个习惯要纠正下) 那么这里先抛个疑问StringJoiner是线程安全的吗?

append 昨天理解错了 以为join出来的是 [1],[2],[3] 这种结构的,结果是 [1,2,3] = =....

public final class StringJoiner {
    private final String prefix; // 前缀
    private final String delimiter; //分隔符
    private final String suffix; //后缀
    
    private StringBuilder value; //拼接的内容串就放在这里
    private String emptyValue; //?? 默认串 看注释是当value为空时调用toString()返回的默认字符串! 
     //这个变量不是final的,也提供了public StringJoiner setEmptyValue(CharSequence emptyValue) 供调用者自己定义返回的默认值。
....
}


    //测试emptyValue
        @Test
        public void testOne(){

        StringJoiner sj = new StringJoiner(",","{","}");

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

        sj.setEmptyValue("this is empty");

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

        sj.add("first");

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

    }
    
    /** 输出    
    {}
    this is empty
    {first}
    **/
   

了解了大概结构 后面的主要方法理解起来就很容易了先是add方法


    public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
    
    //prepareBuilder() 主要做了两件事情,
    //如果value为空则初始化value = new StringBuilder(); 然后加上 prefix + newElement
    //如果value不为空则 value + delimiter + newElement;
    
    //所以add之后,value的尾巴最后都木有 suffix 那在哪里加上呢?
    
    //当然是在toString的时候了    
    @Override
    public String toString() {
        if (value == null) {
            return emptyValue;
        } else {
            if (suffix.equals("")) {
                return value.toString();
            } else {
                int initialLength = value.length();  //记录没有加上suffer的时候的长度
                String result = value.append(suffix).toString();
                // reset value to pre-append initialLength
                value.setLength(initialLength); //复位!
                return result;
            }
        }
    }   

上面就是StringJoiner的主要工作原理了
值得注意的是length方法
如果value为空的时候返回 emptyValue的长度 不为空的时候 返回value + suffix的长度

相关文章

网友评论

      本文标题:StringJoiner源码阅读

      本文链接:https://www.haomeiwen.com/subject/bvfozttx.html