以前の日記でprintln(obj)をするとobj.toStringの結果が出るということを書きましたけど、今日はその延長。
println(obj)をすると中でごにょごにょする訳だけど、
println(obj + String)をするとobj + Stringが新しいStringとなってprintされる。
今日はその+の部分を友人の指導のもと見てみました。
eclipseだとStringクラスの中も逆コンパイルして見せてくれる。
じゃあ+の中も見れる!?と思ったけどそれは言語仕様みたい。
http://www.y-adagio.com/public/standards/tr_javalang/index.htm
最新かどうか、そもそも正しいか分からないけど日本語訳ありがてえ!
早速加減演算の項をチェック。
文字列連結の最適化 処理系は中間的なオブジェクトStringの作成及び廃棄を避けるために,変換及び連結を一段階で実行してもよい。Javaコンパイラは,繰り返される文字列連結の性能向上を目的として,式の評価によって作成される中間的なオブジェクト Stringの数を減らすために,クラス StringBuffer(20.13) 又は同様な技術を使用してもよい。
ふむふむ。
まあ実際のところよくわかってないけど、少なくともtoStringの中で新しく文字列作成してるときはこうしてる
[java] public String toString() { return (new StringBuilder()).append(getClass().getName()).append("@").append(Integer.toHexString(hashCode())).toString(); } [/java]
ちなみに友人曰くこれは逆コンパイル結果であって実際のコードはおそらくこうらしい。
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
ふむ、なるほど。+はStringBuilderとappendになるのかな。
というわけでまた少しだけ詳しくなりました。
コメントを残す