• ベストアンサー

StringBufferからStringへキャストする

StringBufferからStringへキャストする方法としてどちらを用いるのが一般的なのでしょうか StringBuffer sb として public String ***(***)メソッドの最後に 1. return sb.toString()とする 2. return new String(sb)とする 私は1を使っていたのですが、 Javaの規約だか処理能力が良い方法だかに 厳しい人が2を使っていたので少し戸惑う程度ですが… 回答よろしくお願いします。

noname#6248
noname#6248
  • Java
  • 回答数4
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • bo-ken
  • ベストアンサー率42% (3/7)
回答No.3

toString()メソッドは全てのClassのスーパクラスであるObjectクラスのメソッドです。 その他のクラスのtoString()メソッドは、これをオーバライドしたに過ぎません。 toString()メソッドの用途はそのオブジェクトを視覚的にあらわすときに利用します。オブジェクトのダンプイメージです。 今回はStringBufferクラスのtoString()メソッドのためダンプイメージがStringそのもののため問題ありませんが、 「Stringにキャストする」と明示的に処理するには2を使用するのが正解と思います。 格クラスのtoString()メソッドはDEBUGで画面やファイルに出力するときに使用すると考えたほうが賢明と思います。

その他の回答 (3)

noname#16216
noname#16216
回答No.4

参考URLに、この問題についての議論が行われています そこでも議論されているように正しいのは2の方だと思います。 未だにJava自身のソースや「プログラミング言語Java 第3版」の中でも、sb.toString()が 例として上がっているようですが。 ちなみに、個人的に1を使っていました。 1つ勉強になりました

参考URL:
http://java-house.jp/ml/archive/j-h-b/012934.html
noname#6248
質問者

お礼

まとめてのお礼になり申し訳ないです。 皆様の意見を私なりに解釈してこうなりました。 ・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さん、本当にありがとうございました。

  • web5
  • ベストアンサー率0% (0/2)
回答No.2

StringBufferソースを見ると、 return new String(sb); のようにtoString()がオーバーライドされていたと思います。 厳しい人が2を使っていたというのは、 その方が正確・・・というか、理解しやすいからでしょう。 1を使う人は、StringBufferのtoString()が、 オーバーライドされているということを知らない人が多いと思います。 ちなみに、私も2の書き方をします。 また、バイトコードのサイズを比較されていた方もおられますが、 現在はHDDもメモリも安価になり、大量に積んでいるマシンが多いため、 あまり気にすることはないように思います。 sb.toString()を使ってtoString()内部で何がされているかわからないよりも、 new String(sb)として、Stringオブジェクトを返しているという明示的なわかりやすさを得る方がいいと思います。

  • aton
  • ベストアンサー率47% (160/334)
回答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

  • JAVA:toStringについて

    JAVAの"toString"について教えてください。 public synchronized String format(LogRecord record) StringBuffer sb = new StringBuffer(); sb.append(日付); sb.append(":"); sb.append(record); return sb.toString(); とした場合、StringBufferが解放されないため、メモリリーク等 発生しますでしょうか? また、回避するにはどうすればよいでしょうか? お力添えを宜しくお願いします。

  • エラーの意味を

    こんにちは。 いろいろと調べてみたんですが、どうにもわからなくて・・・。 Eclipseなんですが、 あるクラス(下記のようなクラス) public String test( MAp map ){ StringBuffer sb = new StringBuffer(); sb.append("~いろいろ~"); ~中略(これがたくさん・・・)。~ return sb.toString(); } で、エラーメッセージ メソッド test(java.util.Map) のコードが 65535 バイトの制限を超えています。 が出ます。 エラー個所はメソッドの宣言部 test( MAp map ) になっています。 StringBufferに65535バイトしか入らない・・・、という事はないですし、 何が原因なのかサッパリです・・・。 よろしくお願いします。

    • ベストアンサー
    • Java
  • StringBufferについて

    f(sba,sbb)を実行後のsbbの出力結果に疑問があります。sbaの引数をsb1で受け取ったのを編集しても、sbaで出力しているので変数が違うから当然出力結果に変化がないのは頷けますが、なぜsb2.append("ddddd");では変数をsbbで出力させているのに、sbbの結果が反映されているのかが分かりません。 実行結果 sba = aaaaa sbb = bbbbb sba = aaaaa sbb = bbbbbddddd 返答のほどよろしくお願いいたします。 class Arguments{ public static void main(String args[]){ StringBuffer sba = new StringBuffer("aaaaa"); StringBuffer sbb = new StringBuffer("bbbbb"); System.out.println("sba = " + sba); System.out.println("sbb = " + sbb); f(sba,sbb); System.out.println("sba = " + sba); System.out.println("sbb = " + sbb); } public static void f(StringBuffer sb1, StringBuffer sb2){ sb1 = new StringBuffer("ccccc"); sb2.append("ddddd"); } }

    • ベストアンサー
    • Java
  • エラー処理について

    ファイルを引数に取って、そのファイルの中身を文字列として返す自作メソッドをウェブで見つけたので、そのまま使用しようと思いました。しかし、ファイルが空ファイルの場合はこのメソッドだとエクセプションエラーになってしまうようです。どこかを変更して、メイン側で適切に処理してあげなければならないと思われるのですが、どこをどう修正すればよいでしょうか。自分で作成したものでもないので、見当がつかない状態です。。申し訳ありませんが宜しくお願いします。 public static String fileToString(File file) throws IOException { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); StringBuffer sb = new StringBuffer(); int c; while((c=br.read())!=-1) { sb.append((char) c); } return sb.toString(); } finally { br.close(); } }

    • ベストアンサー
    • Java
  • StringBufferで改ページ処理を行うには?

    StringBufferに格納した文字列を、Printableで出力する処理を作成しています。 その際、StringBufferに「\n」を格納すると、改行させることが出来るのですが(例1)、 「\f」を格納して改ページをさせようと思っても、中点(・)が印字されてしまい、 上手く改ページさせることが出来ません(例2)。 StringBufferで改ページをさせるには、どうしたら宜しいのでしょうか? ※例1 【PGM】 StringBuffer sb = new StringBuffer(); sb.append("改行"); sb.append(\n); sb.append("テスト"); 【出力結果】 改行 テスト ※例2 【PGM】 StringBuffer sb = new StringBuffer(); sb.append("改ページ"); sb.append(\f); sb.append("テスト"); 【出力結果】 改ページ・テスト ※ \は実際には「バックスラッシュ」です

    • ベストアンサー
    • Java
  • ローカル変数を戻り値に使うと良くない C#

    C#2008で以下のように、Dumpメソッドを使った場合、 return sb.ToString();としていますが、 昔ローカル変数を戻り値に使うと良くないという 記憶があったのですが、正確なことはすっかり忘れてしまい 確か値型なら問題ないと思ったのですが、 以下の方法は正しくないでしょうか? 戻り値にこだわったのは、使えれば便利かなという程度です。 namespace Modorichi { public struct Test { public int a; public PlayInfo(string dummy) { a = -1; } public string Dump() { StringBuilder sb = new StringBuilder(); sb.Append(String.Format("a=[{0}]\n", this.a)); return sb.ToString(); } } }

  • StringBuilderをStringに代入

    StringBuilderを使って文字列連結して、それをSQL文(String型)として利用するプログラムを作りました。 ※SQLはループ処理で約10万個ぐらい発行→実行します StringBuilderの文字列を、最終的にString型の変数(strSql)に代入するのですが、 下記のどちらで代入する方がコスト掛からないでしょうか? A案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = new String(sb); ---------- B案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = sb.toString(); ---------- 教えてください。

    • ベストアンサー
    • Java
  • byte[]→String変換後の文字列が違うのはなぜ?

    byte[]→String変換の処理を行っていたのですが、 使うメソッド(コンストラクタ)によって結果が違ってきます。なぜだかよくわからないのですが、どなたかご説明していただけないでしょうか。 byte[] bt; String str1 = "12345", str2; bt = str1.getBytes(); (1)str2 = new String(bt); (2)str2 = bt.toString(); (1)の方法と(2)の方法では答えが違ってきます。(1)では"12345"でしたが、(2)ではなんだか記号などまざったぐちゃぐちゃな文字列でした。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • JavaでString型をChar型に変換するプログラムが分かりません

    JavaでString型をChar型に変換するプログラムが分かりません;; どなかた助けて下さい。 下のプログラムの何がいけないんでしょうか?? いろいろ間違ってるところはあると思うんですが、教えて下さい! import java.io.*; class { public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); StringBuffer moji = new StringBuffer(str1); char nyuu=moji;

  • 文字列から半角スペースと全角スペースを取り除く処理

    DBから取得した文字列に半角スペースか全角スペースが 含まれている場合取り除きたい、と考えています。 以下の様なロジックを考えているのですが、 こんな感じで良いのでしょうか。 普通は、どの様にするのでしょうか? アドバイスなどありましたら、お願い致します。m(__)m private String test(String str) {  StringBuffer sb = new StringBuffer();  char[] chr = str.toCharArray();  for(int p=0;p<chr.length;p++) {   if( chr[p] == ' ' || chr[p] == ' ' ) continue;   sb.append(chr[p]);  }  return sb.toString(); }

    • ベストアンサー
    • Java

専門家に質問してみよう