Java中的String运算符

时间:2010-02-24 18:31:24

标签: java string operator-overloading string-concatenation

几分钟前我看到了this question,并决定查看java String类来检查+运算符是否存在重载。

我找不到任何东西,但我知道我可以做到这一点

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

实施的地方在哪里?

7 个答案:

答案 0 :(得分:12)

来自Fine Manual

  

Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。字符串连接是通过StringBuilder(或StringBuffer)类及其append方法实现的。字符串转换是通过方法toString实现的,由Object定义并由Java中的所有类继承。有关字符串连接和转换的其他信息,请参阅Gosling,Joy和Steele, Java语言规范

请参阅JLS中的String Concatenation

答案 1 :(得分:7)

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

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

所以,就像我说的那样。

答案 2 :(得分:2)

由编译器处理。

答案 3 :(得分:2)

这是language specification中记录的特殊行为。

  

15.18.1 String Concatenation Operator +

     

如果只有一个操作数表达式   键入String,然后进行字符串转换   在另一个操作数上执行   在运行时生成一个字符串。该   result是对String的引用   对象(新创建的,除非   expression是一个编译时常量   表达式(§15.28))即   两个操作数的串联   字符串。的人物   左手操作数先于   右手操作数的字符   在新创建的字符串中。如果   那么String类型的操作数是null   使用字符串“null”代替   那个操作数。

答案 4 :(得分:2)

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

我想补充一点,每个人都应该看看String的源代码并在某些时候追加,这非常令人印象深刻。

我相信它归结为:

"a"+"b"+"c"

=

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

然而一些魔法发生了。这变成了:

  • 创建一个长度为3的字符串数组
  • 将a复制到第一个位置。
  • 将b复制到第二个
  • 将c复制到第三个

虽然大多数人认为它会创建“ab”,然后在创建“abc”时扔掉它。它实际上理解它被链接并进行一些操作。

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

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

现在我只是在困惑。阅读源代码 - 这很酷。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

String被定义为标准类型,就像编译器级别上的int,double,float等。基本上,所有编译器都有运算符重载。没有为开发人员定义操作符重载(与C ++不同)。

有趣的是:这个问题被记录为一个错误:http://bugs.sun.com/view_bug.do?bug_id=4905919