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() を使うメリットは何も考えられないのですが…。
No.2
- 回答日時:
StringBufferソースを見ると、
return new String(sb);
のようにtoString()がオーバーライドされていたと思います。
厳しい人が2を使っていたというのは、
その方が正確・・・というか、理解しやすいからでしょう。
1を使う人は、StringBufferのtoString()が、
オーバーライドされているということを知らない人が多いと思います。
ちなみに、私も2の書き方をします。
また、バイトコードのサイズを比較されていた方もおられますが、
現在はHDDもメモリも安価になり、大量に積んでいるマシンが多いため、
あまり気にすることはないように思います。
sb.toString()を使ってtoString()内部で何がされているかわからないよりも、
new String(sb)として、Stringオブジェクトを返しているという明示的なわかりやすさを得る方がいいと思います。
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さん、本当にありがとうございました。
お探しの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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
StringBufferで改ページ処理を行うには?
Java
-
substring バイト単位でやりたい
Java
-
-
4
int型のゼロ埋め
Java
-
5
[JAVA]try 内の変数を外で!?
Java
-
6
tableタグとformタグの組み合わせ
HTML・CSS
-
7
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
8
jsp~jspにhiddenを使って変数を飛ばしたい
JavaScript
-
9
オブジェクトの中のプロパティを認識できません
Java
-
10
人月を時間にすると?
数学
-
11
Javascriptの値をJava(JSP)へ渡す方法
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
レコード件数の表示
-
なぜprotected overrideなのか
-
abstract と static を一緒に付...
-
StringBufferからStringへキャ...
-
C# 点の描き方をおしえてくだ...
-
YYYYMMDD書式の日付に対する適...
-
System.out.print
-
Java 「参照型の型変換」について
-
[クラス名].[メソッド名].[メソ...
-
テキストファイルに書かれた文...
-
コマンドライン引数のチェック
-
C# でメソッドに送られてきたOb...
-
変数とフィールドの使い分け
-
Strutsでチェックボックスの値...
-
public static void main (Stri...
-
Path型またはString型をURL型に...
-
return new使用時
-
メソッドとコンストラクタ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
なぜprotected overrideなのか
-
Strutsでチェックボックスの値...
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
C# 点の描き方をおしえてくだ...
-
レコード件数の表示
-
public static void main (Stri...
-
StringBufferからStringへキャ...
-
YYYYMMDD書式の日付に対する適...
-
C# でメソッドに送られてきたOb...
-
シェルスクリプトからのJavaメ...
-
C# の ByVal と ByRef について
-
Fileの読み取り専用の解除
-
CSVから読み込んだデータの保持...
-
メソッドの引数に指定されてい...
-
javaに"search"という関数 or ...
-
Javaのメモリの管理
-
Java初心者です、エラーの意味...
おすすめ情報