【问题标题】:How is + implemented in Java? [duplicate]+ 在 Java 中是如何实现的? [复制]
【发布时间】:2012-12-15 07:17:03
【问题描述】:

可能重复:
java String concatenation

消息来源告诉我们,concat 的实现方式如下:

   public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        int len = value.length;
        char buf[] = Arrays.copyOf(value, len + otherLen);
        str.getChars(buf, len);
        return new String(buf, true);
    }

+ 在字符串方面的实现是否不同?如何? +concat 之间是否存在性能差异。什么时候应该选择一个而不是另一个?

【问题讨论】:

  • 在有人关闭它之前,请注意,问题不在于+ 是否与concat 相同,而是处理特定的+ 实现。谢谢
  • 正如链接的答案所述,这是使用 StringBuilder 完成的,它是 append 方法。它还解决了您的性能考虑问题。
  • 实际上,我认为 question 必须是重复的才能被关闭。可以在完全不相关的问题中回答这一事实绝不会使 question 成为骗子。请注意,我并不是说这不是欺骗问题,只是说作为欺骗关闭的“在其他地方回答”的推理是有缺陷的 - 它应该“在其他地方询问”。

标签: java


【解决方案1】:

这是我刚做的一个测试:

我用这 3 个指令创建了一个类:

    String s1 = "foo";
    String s2 = "bar";
    String s3 = s1 + s2;

然后我获取生成的 .class 文件并使用 JAD 反编译器进行反编译。 这就是代码在重新生成的源代码中的显示方式:

    String s = "foo";
    String s1 = "bar";
    String s2 = (new StringBuilder()).append(s).append(s1).toString();

所以:这就是 + 和 concat 之间的区别。

我猜 concat() 总是比 StringBuilder 好,因为它需要创建的对象更少。如果要在循环中重复追加字符串,可以选择 StringBuilder;在这种情况下, concat 可能每次都创建一个新的 String ,而 StringBuilder 可能只是扩展内部缓冲区。但是,如果 StringBuilder 在最后一种情况下是最好的,我们可以说 concat() 在循环中仍然比 +, 更好。

【讨论】:

  • +1 表示一种聪明的方法。但可能应该注意,这是依赖于实现的,当有两个字符串输入时,Java 规范 AFAIK 中没有任何内容可以停止 + 使用 concat 实现
  • JLS 15.18.1 明确表示它依赖于实现。但是 StringBuilder 很快就会变得比concat() 更好,因为concat() 需要复制所有以前的字符,这意味着如果你要连接5个字符串,第一个字符将被复制4次(第二个3次, 等等)。使用 StringBuilder,每个字符串只有一个副本。
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多