StringJoiner源码阅读

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的长度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 集合框架: 1)特点:存储对象;长度可变;存储对象的类型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang阅读 1,286评论 0 4
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,518评论 0 3
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,288评论 0 16
  • 有情饮水饱,无事闲来娇。 遇见的时候总是被眼前的人迷了眼,不知几时会红了眼,能这么悲观的去想,我知道我是动了心,动...
    思似柳万绦阅读 460评论 0 0