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で質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java java final 1 2022/06/10 22:49
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
StringBufferで改ページ処理を行うには?
Java
-
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
Javascriptの値をJava(JSP)へ渡す方法
Java
-
-
4
tableタグとformタグの組み合わせ
HTML・CSS
-
5
substring バイト単位でやりたい
Java
-
6
JSPの処理の途中で、JavaScriptの処理をしたい
JavaScript
-
7
[JAVA]try 内の変数を外で!?
Java
-
8
JavaScriptの変数をjavaのメソッドの引数に渡す
JavaScript
-
9
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
10
Selectの中身をfor文で入れる
JavaScript
-
11
単一グループのグループ関数ではありません。
Oracle
-
12
正しいURL指定しているにもかかわらずJSPファイルにアクセスできず「404エラー」が発生
Java
-
13
人月を時間にすると?
数学
-
14
javaのCSVデータ読込についてです
Java
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコード件数の表示
-
abstract と static を一緒に付...
-
Java初級 引数に適用できません
-
Google Apps Script で getRang...
-
なぜprotected overrideなのか
-
メソッドの引数に指定されてい...
-
C# 点の描き方をおしえてくだ...
-
不要なstaticメソッドの見分け...
-
String.containsの反対機能はあ...
-
javaに"search"という関数 or ...
-
【アクセス修飾子】アクセス修...
-
JavaでOpenCVを扱いたいのです...
-
C# asp.net HTMLタグのエスケ...
-
Javaの問題なんですが、Window ...
-
クラスを作るとメソッドの数が...
-
C言語での文字列より値を抜き出す
-
YYYYMMDD書式の日付に対する適...
-
継承とオーバーライド
-
VB FindFirstの動きを.Netで・・・
-
JavaからCへ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
public static void main (Stri...
-
abstract と static を一緒に付...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
メソッド宣言の戻り値の型にク...
-
javaに"search"という関数 or ...
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
なぜprotected overrideなのか
-
親の親のメソッドを呼ぶには?
-
C# でメソッドに送られてきたOb...
-
Javaの関数名が長い?
-
別クラスのmainメソッドの実行
-
[クラス名].[メソッド名].[メソ...
-
コマンドライン引数のチェック
-
contextってなんですか?
-
説明文書でのメソッド・変数の...
おすすめ情報