博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava源码浅析——Joiner
阅读量:5745 次
发布时间:2019-06-18

本文共 3695 字,大约阅读时间需要 12 分钟。

Join类的源码解析

[TOC]

Join类的基本功能

  • 通过Join类,我们可以方便实现将容器中的数据按照自定义的方式拼接成一个字符串,而且这是一种线程安全的方式。

    ArrayList
    integers = Lists.newArrayList(1,2,3,4);String join = Joiner.on("---").join(integers);System.out.println(join);复制代码

实现原理

  • 通过查看Joiner的源码可以发现Join的源码是私有的,也就是不让我们直接去新建对象,而是让我们通过提供的共有静态方法去构建对象:

    public static Joiner on(char separator) {    return new Joiner(String.valueOf(separator));  }private Joiner(Joiner prototype) {    this.separator = prototype.separator;  }复制代码

    猜测通过这种方法构造对象的主要目的是让使用者明白这里传入的separator参数是用作容器之间额连接符的。

  • 在对象中保存了分隔符之后又是如何进行划分的呢?

    public final String join(Iterable
    parts) { return join(parts.iterator()); }public final String join(Iterator
    parts) { return appendTo(new StringBuilder(), parts).toString(); }public final StringBuilder appendTo(StringBuilder builder, Iterator
    parts) { try { appendTo((Appendable) builder, parts); } catch (IOException impossible) { throw new AssertionError(impossible); } return builder; }复制代码

    上面代码是一种重载的思想,最终是通过appendTo方法进行的字符创拼接,注意到这里传入的第一个参数是一个StringBuilder对象,为了就是保证线程的安全性,防止多线程环境下可能出现的问题。

  • 最后在appendTo函数是如何做字符串拼接的?

    public  A appendTo(A appendable, Iterator
    parts) throws IOException { checkNotNull(appendable); if (parts.hasNext()) { appendable.append(toString(parts.next())); while (parts.hasNext()) { appendable.append(separator); appendable.append(toString(parts.next())); } } return appendable; }复制代码

    可以看到这里首先检查了一下这个StringBuilder是否为空,如果为空就会抛出异常。再然后就是迭代器的遍历了,注意到这里有一个toString()方法,很明显,这里重写了Object类的这个方法:

    CharSequence toString(Object part) {    checkNotNull(part); // checkNotNull for GWT (do not optimize).    return (part instanceof CharSequence) ? (CharSequence) part : part.toString();  }复制代码

    同样这里做了类型检查,就是为了防止容器中有null对象,其次就是如果part本身就是字符数组了,就不用调用tostring方法了,节约系统资源。

    除了第一个元素外,其余每一个元素都是分隔符与元素的拼接,很简单的逻辑。就这样完成了一次拼接操作。

学习的设计模式

转载地址:http://tnazx.baihongyu.com/

你可能感兴趣的文章
pythonwin editor 下载
查看>>
SSM框架以json格式传给前端页面
查看>>
函数指针和指针函数
查看>>
input标签 disabled 和 readonly的区别
查看>>
[Delphi]ListView基本用法大全
查看>>
Tomcat内存溢出解决办法
查看>>
Android获取屏幕高度、标题高度、状态栏高度详解
查看>>
OBJ文件格式分析工具: objdump, nm,ar
查看>>
pycaffe 配置
查看>>
asp.net2.0安全性(2)--用户个性化设置(1)--转载来自车老师
查看>>
【转】Python之列表生成式、生成器、可迭代对象与迭代器
查看>>
黄松130702010036
查看>>
Python3学习笔记(八):集合
查看>>
用U盘和iso镜像文件重装系统
查看>>
C# 调用VBA的帮助类
查看>>
Win10系统下搭建Apache,mysql和PHP(5.6)环境
查看>>
WPF 3D动态加载模型文件
查看>>
无论如何
查看>>
rsync+inotity
查看>>
Touchmove获取当前触摸的Dom节点
查看>>