代码之家  ›  专栏  ›  技术社区  ›  Samuel Carrijo

+Java中字符串的运算符[重复]

  •  7
  • Samuel Carrijo  · 技术社区  · 14 年前

    我看见了 this question + 操作人员

    String ab = "ab";
    String cd = "cd";
    String both = ab + cd; //both = "abcd"
    

    在哪里实施的?

    7 回复  |  直到 7 年前
        1
  •  13
  •   Josh Lee ZZ Coder    14 年前

    Fine Manual :

    Java语言为字符串连接运算符(+)和其他对象到字符串的转换提供了特殊支持。字符串串联是通过 StringBuilder StringBuffer )类及其应用 append 第三版 .

    看见 String Concatenation 在JLS。

        2
  •  8
  •   Sean    14 年前

    编译器将您的代码视为您编写了以下内容:

    String both = new StringBuilder().append(ab).append(cd).toString();
    

    编辑:有参考资料吗?好吧,如果我编译并反编译OP的代码,我会得到:

    0:  ldc #2; //String ab
    2:  astore_1
    3:  ldc #3; //String cd
    5:  astore_2
    6:  new #4; //class java/lang/StringBuilder
    9:  dup
    10: invokespecial   #5; //Method java/lang/StringBuilder."<init>":()V
    13: aload_1
    14: invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    17: aload_2
    18: invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    21: invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
    24: astore_3
    25: return
    

    就像我说的。

        3
  •  3
  •   Bill K    14 年前

    这里的大多数答案都是正确的(由编译器处理,+转换为.append()…)

    我想补充一点,每个人都应该看看字符串和附加的源代码,这是相当令人印象深刻的。

    我相信归根结底是这样的:

    "a"+"b"+"c"
    

    =

    new String().append("a").append("b").append("c")
    

    但随后一些魔法发生了。这会变成:

    • 创建长度为3的字符串数组
    • 把b复制到第二个
    • 把c复制到第三个

    然而大多数人相信它会创造“ab”,当它创造“abc”时,就把它扔掉了。它实际上知道自己被锁住了,并进行了一些操作。

    还有一个技巧,如果你有一个字符串“abc”并且你要求一个结果是“bc”的子字符串,那么它们可以共享完全相同的底层数组。您会注意到有一个起始位置、结束位置和“共享”标志。

    事实上,如果它没有被共享,它就有可能扩展一个字符串的长度并复制其他字符串。

    现在我只是有点困惑。阅读源代码——相当酷。

        4
  •  2
  •   Fredrik    14 年前

        5
  •  2
  •   Otto Allmendinger    14 年前

    这是记录在 language specification

    如果只有一个操作数表达式是 键入String,则字符串转换为 对另一个操作数执行 结果是对字符串的引用 对象(新创建的,除非 表达式是编译时常量 两个操作数的并置 左操作数在 右操作数的字符 在新创建的字符串中。如果 字符串类型的操作数为空,则 那个操作数。

        6
  •  0
  •   C. K. Young    14 年前

    这是在语言层面上完成的。Java语言规范是 very specific about what string addition must do .