在Java源代码中为字符串实现`+`在哪里?

sdg*_*sdh 35 java string string-concatenation operators

String是Java中的一个特例.这是一个类,我可以在源代码中检查它,但它也有自己的中缀运算符+,它似乎是语法糖StringBuilder.

例如,

"Hello " + yourName;
Run Code Online (Sandbox Code Playgroud)

可能成为

new StringBuilder().append("Hello ").append(yourName).toString();
Run Code Online (Sandbox Code Playgroud)

Java中没有用户定义的运算符,所以在哪里+指定String

是否可以使用相同的机制来制作其他运算符,例如向量?

The*_*ind 44

+在java 编译器中实现.编译器替换 String + String与任何编译时间常数或StringBuilder代码.请注意,这也适用于基元.即,int i=1+2可以int i=3在编译期间直接替换为.

  • 当你要求链接到编译器源时,[这里是为字符串实现`+`的Jikes编译器](http://jikes.cvs.sourceforge.net/viewvc/jikes/jikes/src/bytecode.cpp?revision=1.185 &视图=标记#l5946) (6认同)
  • @aishu - 没有.JVM通常不会在这里出现.编译器做了这个 (3认同)
  • 你有这个链接到编译器源吗? (2认同)
  • @sdgfsdh - 我可以给你看字节码.那还够吗?您将能够看到`+`不是字节代码的一部分 (2认同)

Sur*_*tta 23

您可以查看规格.编译器具有它的实现,而不是Java源代码.

Java Language Specification- 15.18.1. String Concatenation Operator +

实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间String对象.为了提高重复字符串连接的性能,Java编译器可以使用StringBuffer类或类似技术来减少通过计算表达式创建的中间String对象的数量.

它显示了实现取决于编译器的证据.


Tag*_*eev 5

虽然目前大多数Java编译器都使用StringBuilder链,但并未指定它应始终采用这种方式.特别是有一个建议在Java-9中彻底改变它,用单个invokedynamic调用替换并引入新的metafactory,它将MethodHandle在运行时生成适当的连接以执行连接.