web-dev-qa-db-ja.com

Javaソースコードの文字列に `+`はどこに実装されていますか?

StringはJavaの特殊なケースです。これは、 ソースコード で調べることができるクラスですが、独自の中置演算子+もあります。これは、StringBuilderの構文糖衣のようです。

例えば、

"Hello " + yourName;

になる可能性があります

new StringBuilder().append("Hello ").append(yourName).toString();

Javaにはユーザー定義の演算子がないので、String+を指定する場所はどこですか?

同じメカニズムを使用して、ベクトルなどの追加の演算子を作成できますか?

36
sdgfsdh

_+_はJava compilers。コンパイラreplacesString + Stringに実装されています。 コンパイル時定数またはStringBuilderコードのいずれかを使用します。これはプリミティブにも適用されることに注意してください。つまり、_int i=1+2_は_int i=3_コンパイル自体中。

44
TheLostMind

仕様で確認できます。コンパイラには、Javaソースコードではなく、実装されています。

Java Language Specification- 15.18.1. String Concatenation Operator +

実装は、中間のStringオブジェクトを作成して破棄することを回避するために、変換と連結を1つのステップで実行することを選択できます。繰り返される文字列連結のパフォーマンスを向上させるために、Javaコンパイラは、StringBufferクラスまたは同様の手法を使用して、式の評価によって作成される中間Stringオブジェクトの数を減らすことができます。

これは、実装がコンパイラに依存しているという証拠を示しています。

23
Suresh Atta

現在、ほとんどのJavaコンパイラはStringBuilderチェーンを使用していますが、常にこのようにする必要があるとは指定されていません。特に、変更する 提案 があります。これはJava-9で大幅に置き換えられ、単一のinvokedynamic呼び出しに置き換えられ、連結を実行するために実行時に適切なMethodHandleを生成する新しいメタファクトリが導入されます。

5
Tagir Valeev

言語に関しては、いいえ、それは拡張可能ではありません。これは特定の動作であり、他のクラスは+演算子を拡張しません。

これが行われる場所については、次のファイルで string_add(実際のJVM操作ではありません) を検索してください。


理由については、Javaは単純であるか、少なくともC++よりも単純であると想定されており、文字列操作などの基本的なことは一種の必須でした。ただし、演​​算子のオーバーロードは複雑さを増します。

2
acelent