您当前的位置: 首页 > 

庄小焱

暂无认证

  • 3浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDK源码——String类

庄小焱 发布时间:2021-03-28 20:01:44 ,浏览量:3

摘要

之前,我们经常会通过StringBuffer或者StingBuilder对字符串进行拼接,但是你知道Java8中推出的StringJoiner吗?它比前者更加优美、灵活,如果你现在还使用StringBuffer拼接,强烈推荐你试试StringJoiner。基于StringBuilder实现,add时就把prefix和分隔符给加上了,suffix永远都不加,知道toString和length调用时才加入计算。这样带来的merge操作实现的极大便利性

StringJoinert介绍
import java.util.StringJoiner;
import java.util.stream.IntStream;

/**
 * @Classname StringTest
 * @Description TODO
 * @Date 2021/3/28 19:39
 * @Created by xjl
 */
public class StringTest {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        IntStream.range(1, 11).forEach(i -> {
            sb.append(i + "");
            if (i < 10) {
                sb.append(",");
            }
        });
        System.out.println(sb);

        System.out.println("***************************************");
        StringJoiner sj = new StringJoiner(",");
        IntStream.range(1,10).forEach(i->sj.add(i+""));
        System.out.println(sj);


        System.out.println("***************************************");
        //值依次是分割符 , 前缀  ,后缀
        StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
        stringJoiner.add("xiao");
        stringJoiner.add("zhi");
        System.out.println(stringJoiner.toString());

        System.out.println("***************************************");
        //StringJoiner在处理sql拼接上面,也非常方便,如拼接 sql 的in条件的时候:

        StringJoiner joiner3 = new StringJoiner("','", "'", "'");
        joiner3.add("1").add("2");
        System.out.println(joiner3);

    }
}
1,2,3,4,5,6,7,8,9,10
***************************************
1,2,3,4,5,6,7,8,9
***************************************
[xiao,zhi]
***************************************
'1','2'
源码

这个类的源码很简单,大家很容易就可以看明白。StringJoiner 更像一个装饰者模式,对外隐藏了StringBuilder。不过需要注意的是 StringJoiner 并且没有处理一些基本的集合元素情况,比如加入列表的元素,更像针对Collectors而设计。

package java.util;

public final class StringJoiner {
    private final String prefix;//前缀
    private final String delimiter;//间隔符
    private final String suffix;//后缀
    private StringBuilder value;//值

    private String emptyValue;//空值

    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;//空值被设置为只有前后缀
    }
 //设置空值,检查是否为null
    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();
                // reset value to pre-append initialLength
                value.setLength(initialLength);
                return result;
            }
        }
    }
    //初始化,先添加前缀,有了之后每次先添加间隔符,StringBuilder后续append字符串
    public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
 //合并StringJoiner,注意后面StringJoiner 的前缀就不要了,后面的appen进来
    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;
    }
 //初始化,先添加前缀,添加之后每次先添加间隔符
    private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }

    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());
    }
}
关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0406s