我来水个 Java 字符串拼接的问题

本贴最后更新于 1990 天前,其中的信息可能已经东海扬尘

Java 字符串拼接是直接这样:

String b = "123";
String d = "a" + b + "c" + ...;

还是调用像这样的方法,好一些:

public static String append(Object... strings) {
    if (strings.length == 0) {
        return "";
    }

    StringBuilder builder = new StringBuilder(Arrays.toString(strings).length);
    for (String str : strings) {
	builder.append(str);
    }

    return builder.toString();
}

理由是...

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 字符串
    30 引用 • 57 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8128 引用 • 37048 回帖 • 160 关注

相关帖子

被采纳的回答
  • 88250 1 1 赞同

    前者简单些好。虽然提炼小方法可以提升代码可读性,但大部分场景下并不需要这样做。或者说即使非要这样做,可以考虑放在后期重构优化阶段,项目开始时不用做到这么细致,除非这部分代码是核心代码。

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone9891 1 2 赞同
    String b = "123"; 
    String d = "a" + b + "c" + ...;
    

    这个其实是不影响的。只有

    String a = "2";
    String b = "2121"
    String c = a+ b; 
    

    的时候才会出现多个对象的问题。

  • someone9891 1 1 赞同

    还有就是,你这段代码编译通不过

    public static String append(Object... strings) {
            if (strings.length == 0) {
                return "";
            }
            StringBuilder builder = new StringBuilder(strings.length);
            for (Object str : strings) {
                builder.append(str);
            }
    
            return builder.toString();
        }
    

    Arrays.toString() 返回的是一个 String,String 没有 length 属性,但是有个 length()方法,

    但是根据你需要的 String 拼接的话,你完全就把参数的 strings 遍历 append 到 builder 就可以了

    1 回复
  • someone9891 1 1 赞同

    至于你说的,理由,是因为 builder 只有一个对象,而 String + 的时候,可能会产生多个对象。
    比如:

    String a = "1";
    for(int i =0; i < 10 ;i ++){
    	String b += a;
    }
    
    

    这样其实产生了很多个对象。

    但是

    String a = "22";
    StringBuilder bd = new StringBuilder();
    for(int i =0 ;i< 10 ;i++){
    	bd.append(a);
    }
    

    这样其实就两个对象。
    另外提一句,多线程情况,请考虑用 StringBuffer ,StringBuffer 的 append 方法 是同步的,如下为 jdk1.8 源码:

        @Override
        public synchronized StringBuffer append(Object obj) {
            toStringCache = null;
            super.append(String.valueOf(obj));
            return this;
        }
    
        @Override
        public synchronized StringBuffer append(String str) {
            toStringCache = null;
            super.append(str);
            return this;
        }
    
  • 88250 1 1 赞同

    前者简单些好。虽然提炼小方法可以提升代码可读性,但大部分场景下并不需要这样做。或者说即使非要这样做,可以考虑放在后期重构优化阶段,项目开始时不用做到这么细致,除非这部分代码是核心代码。

    2 回复
  • Eddie

    结果编译器优化掉了。一样没差trollface

  • ellenbboe

    Stringbuffer 是线程安全的,前面通过简单的 + 不是线程安全

    2 回复
    1 操作
    ellenbboe 在 2019-06-16 13:50:30 更新了该回帖
  • ellenbboe

    之前似乎看过 单线程少量数据的用 + 就好了 多线程的用 stringbuffer 单线程大量数据用 builder

    1 操作
    ellenbboe 在 2019-06-15 12:01:36 更新了该回帖
  • Keith1024

    Stringbuilder 不是线程安全的

    1 回复
  • iTanken

    实不相瞒...我这两段代码是纯手打的,不是复制过来的,忘了加 length 方法的括号了 trollface

  • iTanken 1

    有道理。“过早的优化是万恶之源” huaji

  • ellenbboe

    ...错了.是 buffer(尴尬)

  • StringBuilder 也不是线程安全的,只是会比 某些情况下直接 + 创建更少的对象,StringBuffer 才是线程安全的,原因可以看我之前的回复,因为 append 方法是同步的

  • dragon8869

    非核心代码的话,没多大关系的吧

  • hugqq 1

    StringJoiner

    1 回复
  • iTanken

    感谢,通过 StringJoiner,了解到了 String.join(),这正是我想要的,就像 JS 的 Array.join() 一样方便。

请输入回帖内容 ...
iTanken
飘风不终朝,骤雨不终日。 重庆

推荐标签 标签

  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 547 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 15 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 536 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    222 引用 • 473 回帖
  • 电影

    这是一个不能说的秘密。

    120 引用 • 599 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 63 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 638 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    176 引用 • 815 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 132 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 743 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    26 引用 • 84 回帖 • 1 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 355 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 27 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 709 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 4 关注
  • 创业

    你比 99% 的人都优秀么?

    84 引用 • 1399 回帖
  • sts
    2 引用 • 2 回帖 • 195 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 597 关注
  • abitmean

    有点意思就行了

    30 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖