[Java][Tips] String#substringメソッドの仕様

研修なんかでJavaの文法やAPIを教えていると、なぜそんな仕様なんだろう、と思うものが結構あります。

その中のひとつが String#substringメソッドです。このメソッドは文字列から部分文字列を抜き出すためのメソッドですが、第一引数が開始インデックス、第二引数が終了インデックスを表します。文字列のインデックス番号は0番から始まりますので、たとえば、”Knowledge-ex.”という文字列から、”led”を取り出して標準出力に表示したければ、

String str = "Knowledge-ex.";
System.out.println(str.substring(4,6));

とすればよさそうに思えます。 しかしながら、substringメソッドの第二引数は「終了インデックス+1」の番号を指定しないといけないのです。つまり、上記のコードでは、最後の”d”が欠けてしまい、

le

と表示されてしまいます。正しく意図どおりに表示するには、

String str = "Knowledge-ex.";
System.out.println(str.substring(4,7));

としなければなりません。

もしかすると、何か、深い意味があるのかもしれませんが、 素直に考えれば、開始位置も終了位置もインデックス番号を指定できた方が間違いが少ないような気がします。

どうして、こんな仕様にしてしまったのでしょう。というシリーズ第1回でした。
また、思いついたら、エントリをあげたいと思います。