美文网首页
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