Java 字符串拼接是直接这样: String b = '123'; String d = 'a' + b + 'c' + ...; 还是调用像这样的方法,好一些: public static String append(Object... strings) { if (strings.length == 0) { r ..

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2272 引用 • 7713 回帖 • 920 关注
  • 字符串
    23 引用 • 57 回帖
  • Q&A

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

    1123 引用 • 7350 回帖 • 586 关注
被采纳的回答
  • 88250 1 赞同    

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

15 回帖   
请输入回帖内容...
  • gitors 2 赞同  

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

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

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

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

  • gitors 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 回复
  • gitors 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 赞同

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

    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        

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

  • ellenbboe        

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

  • gitors        

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

  • dragon8869  

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

  • hugqq  

    StringJoiner

    1 回复
  • iTanken        

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

请输入回帖内容 ...