StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。
我们查看一下一下代码,试着猜一下。

1.简单的字符串拼接

  输出:HelloWorld

2:可使用特定的分隔符或是前后缀来拼接字符串

注:当我们使用StringJoiner(CharSequence delimiter)初始化一个StringJoiner的时候,这个delimiter其实是分隔符,并不是字符串的初始值

 输出:[Hello,World]

3.实现原理

依赖StringBuilder实现,性能和StringBuilder差不多,同样也是非线程安全的

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;//空值被设置为只有前后缀}//设置空值,检查是否为nullpublic StringJoiner setEmptyValue(CharSequence emptyValue) {this.emptyValue = Objects.requireNonNull(emptyValue,"The empty value must not be null").toString();return this;}@Overridepublic 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 initialLengthvalue.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());}
}

Java8 拼接字符串 StringJoiner相关推荐

  1. java_options字符串拼接_java8 StringJoiner拼接字符串

    StringJoiner可以用来拼接字符串. 字符串拼接 示例如下: public static void test1() { StringJoiner stringJoiner = new Stri ...

  2. java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

    在为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点.其中还有一个重要的拼接方式我没有介绍,那就是Java 8中 ...

  3. java8 stringbuilder_为什么 Java 8 中不再需要 StringBuilder 拼接字符串

    在Java开发者中,字符串的拼接占用资源高往往是热议的话题. 让我们深入讨论一下为什么会占用高资源. 在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它.所以在我们拼接字符串的时候 ...

  4. java8 stringbuilder_为什么 Java 8 中不需要 StringBuilder 拼接字符串

    在Java开发者中,字符串的拼接占用资源高往往是热议的话题. 让我们深入讨论一下为什么会占用高资源. 在Java中,字符串对象是不可变的,意思是它一旦创建,你就无法再改变它.所以在我们拼接字符串的时候 ...

  5. Java如何拼接字符串

    StringBuilder 的 append() 方法 "循环体内,拼接字符串最好使用 StringBuilder 的 append() 方法,而不是 + 号操作符" 这句话,我们 ...

  6. java8 多行字符串_Java8(2):Java8 对字符串连接的改进

    我们提出一个需求:有一个 List,将其格式化为 元素1, 元素2, 元素3, ... 元素N 的字符串形式. 毋庸置疑,Java8 之前我们的第一反应是使用 StringBuilder: publi ...

  7. Java使用guava实现:指定连接符拼接字符串

    Java使用guava实现:指定连接符拼接字符串 代码 pom.xml StringJointDemo.java 运行结果 jdk方法 代码 pom.xml <dependencies>& ...

  8. Java拼接字符串(包括空字符串)的多种方法

    目录 一:问题展示 二:拼接方法 1.使用 "+" 运算符 2.使用String.concat() 3.使用StringBuilder 4.使用StringJoiner 5.使用S ...

  9. String拼接字符串效率低,你知道原因吗?

    面试官Q1:请问为什么String用"+"拼接字符串效率低下,最好能从JVM角度谈谈吗? 对于这个问题,我们先来看看如下代码: public class StringTest {p ...

最新文章

  1. java 对象传递给方法_java – 将对象值传递给方法
  2. [C++ STL] map使用详解
  3. #绘制圆心_SolidWorks2018 绘制草图轮廓练习
  4. 玩转oracle 11g(22):ora-01691和修改密码过期时间
  5. modelsim 安装后运行,出现fatal License Error
  6. n个骰子的点数 java_n个骰子的点数和为s的概率集合输出(Java)
  7. 算法--生成1~n的排列
  8. mysql重置所有表_Mysql脚本之清空当前数据库下的所有表中数据,并重置自增id
  9. 攻击服务器修改数据库,SQL服务器数据库注入式攻击解释
  10. 搭建自己的ngrok服务
  11. 【Hive】性能调优 - map-side JOIN
  12. opencv之在图像上绘制标记---drawMarker
  13. 9. Linux 磁盘与文件管理系统(inode 目录)
  14. h5页面编写注意事项,自己遇到的小问题。
  15. 周志华《机器学习》课后习题(第六章):支持向量机
  16. jxta-P2P学习
  17. 最全5G手机芯片简史
  18. 家里电线装多大的好?
  19. Java如何判断字符串中包含有全角,半角符号
  20. 相似度算法--莱文斯坦距离加入同义词逻辑

热门文章

  1. Walle 瓦力 web部署系统
  2. Programming C#.Classes and Objects.只读字段
  3. linux下的awk程序执行
  4. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .
  5. Ti的DM368系列芯片的所有PDF资料汇总
  6. 李倩星r语言实战_《基于R的统计分析与数据挖掘》教学大纲
  7. ipv4地址是几位二进制数_几张思维导图,让你清楚的知道ip地址怎么回事?
  8. centos 安装boost(caffe需要)
  9. c++ 虚函数的实现机制
  10. 1标志图片_这四种情况将不再扣分罚款!11月起,全国高速统一限速标志