Puzzle : String concatination

この記事は Java Puzzlers Advent Calendar 2016 の 15 日目です。

問題

以下の式文において、評価後の s の値はどれになるでしょうか?

String s = "1" + 1 + 1;

(1) "111"

(2) "12"

(3) "1"

解答

(1) "111"

解説

文字列結合に用いられる + 演算子は、加算演算子 + をオーバーロードしたものです。Java では C++ と異なりプログラマが演算子をオーバーロードすることはできませんが、言語仕様でのオーバーロードは存在します。

C++ における演算子のオーバーロードでは、オペランドの数と式の評価順位については変更することができません。これは Java においても同じです。

文字列結合 s1 + s2 は、s1.concat(s2) に置き換えることができます。問題の式が評価される過程を、括弧を用いて表現すると、以下のようになります。

  1. "1" + 1 + 1
  2. ("1" + 1) + 1
  3. ("1" + "1") + 1
  4. ("1".concat("1")) + 1
  5. ("11") + 1
  6. "11" + 1
  7. "11" + "1"
  8. "11".concat("1")
  9. "111"

繰り返しになりますが、C++ の演算子オーバーロードでは評価順位まで変更することはできません。Java の文字列結合 + は加算演算子 + のオーバーロードであり、C++ と同じルールが適用されます。