No.3ベストアンサー
- 回答日時:
toString()メソッドは全てのClassのスーパクラスであるObjectクラスのメソッドです。
その他のクラスのtoString()メソッドは、これをオーバライドしたに過ぎません。
toString()メソッドの用途はそのオブジェクトを視覚的にあらわすときに利用します。オブジェクトのダンプイメージです。
今回はStringBufferクラスのtoString()メソッドのためダンプイメージがStringそのもののため問題ありませんが、
「Stringにキャストする」と明示的に処理するには2を使用するのが正解と思います。
格クラスのtoString()メソッドはDEBUGで画面やファイルに出力するときに使用すると考えたほうが賢明と思います。
No.4
- 回答日時:
参考URLに、この問題についての議論が行われています
そこでも議論されているように正しいのは2の方だと思います。
未だにJava自身のソースや「プログラミング言語Java 第3版」の中でも、sb.toString()が
例として上がっているようですが。
ちなみに、個人的に1を使っていました。
1つ勉強になりました
参考URL:http://java-house.jp/ml/archive/j-h-b/012934.html
まとめてのお礼になり申し訳ないです。
皆様の意見を私なりに解釈してこうなりました。
・String toString()はObjectメソッドを継承しているクラスなので戻り値がStringである事はJavaをそこそこ触れれば誰もがわかる
・str = strinBuffer.toString();がたまたまStringへキャストした値を返していた。
・newを使用するよりも動作的にも早かった。
と言う理由で(1)が浸透してしまった(orしつつあった)
しかし、strinBuffer.toString();が将来#StringBuffer:6542154等ということになりかねないし、StringBufferクラスを継承させて使おうものならtoString()オーバーライドされればTheEnd…
その点、new String(StringBuffer)ならば確実にキャストされる。
ですので(2)を使用するのが正しい…
atonさん、web5さん、bo-kenさん、spoonyさん、本当にありがとうございました。
No.2
- 回答日時:
StringBufferソースを見ると、
return new String(sb);
のようにtoString()がオーバーライドされていたと思います。
厳しい人が2を使っていたというのは、
その方が正確・・・というか、理解しやすいからでしょう。
1を使う人は、StringBufferのtoString()が、
オーバーライドされているということを知らない人が多いと思います。
ちなみに、私も2の書き方をします。
また、バイトコードのサイズを比較されていた方もおられますが、
現在はHDDもメモリも安価になり、大量に積んでいるマシンが多いため、
あまり気にすることはないように思います。
sb.toString()を使ってtoString()内部で何がされているかわからないよりも、
new String(sb)として、Stringオブジェクトを返しているという明示的なわかりやすさを得る方がいいと思います。
No.1
- 回答日時:
以下の2つのクラスを作って簡単に実験してみました。
==========
class STest1
{
public static void main(String[] args)
{
System.out.println(getString(args[0]));
}
static String getString(String str)
{
StringBuffer sb = new StringBuffer(str);
return sb.toString();
}
}
==========
class STest2
{
public static void main(String[] args)
{
System.out.println(getString(args[0]));
}
static String getString(String str)
{
StringBuffer sb = new StringBuffer(str);
return new String(sb);
}
}
==========
バイトコードのサイズは,STest1.classが605バイト,STest2.classが627バイト。これをそれぞれ javap -c してみると,当然ですが違いはgetString()メソッドの最後の方だけで,STest1のほうが,
8 astore_1
9 aload_1
10 invokevirtual #7 <Method java.lang.String toString()>
13 areturn
であるのに対し,STest2のほうは,
8 astore_1
9 new #7 <Class java.lang.String>
12 dup
13 aload_1
14 invokespecial #8 <Method java.lang.String(java.lang.StringBuffer)>
17 areturn
となっていました。これを見るかぎり,toString()を使ったほうが効率が良く,new String() を使うメリットは何も考えられないのですが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ちょっと先の未来クイズ第2問
9月9日(月)に発表される「第3回子どもマネー川柳」に入賞する川柳を考えてこちらに投稿してください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
Javascriptの値をJava(JSP)へ渡す方法
Java
-
Path型をString型へ変換する(Java)
Java
-
データ数をカウントしたいのですが
Java
-
-
4
[JAVA]try 内の変数を外で!?
Java
-
5
JSPの処理の途中で、JavaScriptの処理をしたい
JavaScript
-
6
count(*)で取得した値をJAVAの変数に代入するには?
Java
-
7
tableタグとformタグの組み合わせ
HTML・CSS
-
8
StringBufferで改ページ処理を行うには?
Java
-
9
「配列定数は、イニシャライザーにおいてのみ使用可能です。」
Java
-
10
レコード件数の表示
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
String.containsの反対機能はあ...
-
Java初級 引数に適用できません
-
javaに"search"という関数 or ...
-
StringBufferからStringへキャ...
-
YYYYMMDD書式の日付に対する適...
-
レコード件数の表示
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
Strutsでチェックボックスの値...
-
説明文書でのメソッド・変数の...
-
return new使用時
-
メソッド宣言の戻り値の型にク...
-
Google Apps Script で getRang...
-
親の親のメソッドを呼ぶには?
-
Javaのメモリの管理
-
objectのSystem.out.plintln()...
-
Fileの読み取り専用の解除
-
getBunds()の使い方
-
なぜprotected overrideなのか
-
System.out.print
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
レコード件数の表示
-
YYYYMMDD書式の日付に対する適...
-
StringBufferからStringへキャ...
-
Strutsでチェックボックスの値...
-
Java初心者です、エラーの意味...
-
Google Apps Script で getRang...
-
C# でメソッドに送られてきたOb...
-
メソッドの引数に指定されてい...
-
なぜprotected overrideなのか
-
Fileの読み取り専用の解除
-
return new使用時
-
クラスを作るとメソッドの数が...
-
javaに"search"という関数 or ...
-
C# 点の描き方をおしえてくだ...
-
親の親のメソッドを呼ぶには?
-
Javaの関数名が長い?
-
CSVから読み込んだデータの保持...
-
別クラスのmainメソッドの実行
おすすめ情報