Java中字符串常见的一些拼接方式总结

 更新时间:2023年04月04日 11:19:11   作者:Java小白笔记  
字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起,下面这篇文章主要给大家总结介绍了关于Java中字符串常见的一些拼接方式,需要的朋友可以参考下

方式一:+ 最常见的方式

        String aa = "今天";
        String bb = "明天";
        System.out.println(aa+bb);

方式二:StringBuilder.append()和StringBuffer.append()

先有StringBuffer后有StringBuilder,两者就像是孪生双胞胎,该有的都有,只不过大哥StringBuffer,大部分方法都经过synchronized修饰,所以StringBuffer是线程安全的,但是它效率就相对StringBuilder较低

        String aa = "今天";
        String bb = "明天";
        StringBuilder sber = new StringBuilder();
        StringBuffer sbf = new StringBuffer();
        sber.append(aa).append(bb);
        System.out.println(sber.toString());
        sbf.append(aa).append(bb);
        System.out.println(sbf.toString());

方式三:String类下的cocat()方法

如果拼接的字符串是null,concat会抛出NullPointerException。如果拼接的字符串是一个空字符串(“”),那么concat的效率要更高。如果拼接的字符串非常多,concat的效率就会下降,因为创建的字符串对象越多,开销越大。

        String aa = "今天";
        String bb = "明天";
        String concat = aa.concat(bb);
        System.out.println(concat);

方式四:String类下的join()方法

JDK1.8提供了一种新的字符串拼接姿势:String类增加了一个静态方法join,第一个参数为字符串连接符

		String aa = "今天";
        String bb = "明天";
        String join = String.join("-", aa, bb);
        System.out.println(join);

方式五:StringJoiner

StringJoiner是JDK1.8,java.util包中的一个类,用于构造一个由分隔符重新连接的字符序列

		String aa = "今天";
        String bb = "明天";
        StringJoiner sj = new StringJoiner(":", "[", "]");
        sj.add(aa).add(bb);
        System.out.println(sj.toString());

StringJoiner源码

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());
    }
}

方式六:StringUtils.join()

实战项目中,我们处理字符串的时候,经常会用到这个类.org.apache.commons.lang3.StringUtils包下,该方法更善于拼接数组中的字符串,并且不用担心 NullPointerException。

		String aa = "今天";
        String bb = "明天";
        String ids[] = {"1","2","3"};
        System.out.println(StringUtils.join(aa,bb,"-","124"));
        String join1 = StringUtils.join(ids,",");
        System.out.println(join1);

总结

到此这篇关于Java中字符串常见的一些拼接方式的文章就介绍到这了,更多相关Java字符串拼接方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解SpringBoot中的index首页的访问、自定义Favicon图标

    详解SpringBoot中的index首页的访问、自定义Favicon图标

    这篇文章主要介绍了SpringBoot中的index首页的访问、自定义Favicon图标,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java 工具类总结目录(分享)

    Java 工具类总结目录(分享)

    下面小编就为大家带来一篇Java 工具类总结目录(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot项目鉴权的4种方式小结

    SpringBoot项目鉴权的4种方式小结

    本文主要介绍了SpringBoot项目鉴权的4种方式小结,包括传统AOP、拦截器、参数解析器和过滤器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • SpringBoot JSON全局日期格式转换器实现方式

    SpringBoot JSON全局日期格式转换器实现方式

    这篇文章主要介绍了SpringBoot JSON全局日期格式转换器,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Java实现简单字符生成器代码例子

    Java实现简单字符生成器代码例子

    这篇文章主要介绍了Java实现简单字符生成器代码例子,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06
  • Java中shiro框架和security框架的区别

    Java中shiro框架和security框架的区别

    这篇文章主要介绍了Java中shiro框架和security框架的区别,shiro和security作为两款流行的功能强大的且易于使用的java安全认证框架,在近些年中的项目开发过程中使用广泛,今天我们就来一起了解一下两者的区别
    2023-08-08
  • MyBatis找不到mapper文件的实现

    MyBatis找不到mapper文件的实现

    这篇文章主要介绍了MyBatis找不到mapper文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 在Java的Spring框架中配置Quartz的教程

    在Java的Spring框架中配置Quartz的教程

    这篇文章主要介绍了在Java的Spring框架中配置Quartz的教程,Quartz是一款高人气的开源作业调度框架,需要的朋友可以参考下
    2016-03-03
  • 一文解开java中字符串编码的小秘密(干货)

    一文解开java中字符串编码的小秘密(干货)

    这篇文章主要介绍了一文解开java中字符串编码的小秘密(干货),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring中的依赖注入DI详解

    Spring中的依赖注入DI详解

    这篇文章主要介绍了Spring中的依赖注入DI详解,组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将依赖关系注入到组件之中,依赖注入的目的并非为软件系统带来更多功能,是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台,需要的朋友可以参考下
    2024-01-01

最新评论