###前提・実現したいこと
ここに質問したいことを詳細に書いてください
現在java se8 sliverの勉強をしているのですが、よく出てくるStringBuilderとtoString についてわかりやすく教えていただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/26 13:54
回答5件
0
ベストアンサー
1.toString について
Objectクラスのメソッド。Javaのクラスは全てObjectクラスのサブクラスなので自作のクラス、API等含めすべてのクラスに「toString 」というメソッドが存在する。役割は「そのオブジェクトを文字列として表現したモノを返却する」
※"全てのクラスに文字列化するための共通メソッドが存在する"というのは大変便利なものでたとえばよくつかうSystem.out.printlnとかを自分で実装することを考えると
Java
1void println(Object obj){ 2 String s = null; 3 if(obj instanceof A){ 4 s=(A)obj.toStr1(); 5 }else if(obj instanceof A){ 6 s=(B)obj.toStr2(); 7 } 8・・・ 9}
みたいな汎用性のカケラもない怪しいモノになってしまうが、"toString"の存在が保証されているので
Java
1void println(Object obj){ 2 String s = obj.toString(); 3・・・ 4}
で済みます。ポルモーフィズムです。
2.toStringのオーバーライド
と、同一のメソッドが定義されているところまでは良いのだがJavaのクラスには
(1)toStringをオーバーライドしていないクラス
(2)toStringをオーバーライドしているクラス
の2種類が存在する(Javaの標準のものも自作のものも)。(1)のものはObjectクラスのデフォルトの出力結果「クラス名@ハッシュコード」を返す。(2)は個別の実装に従って返す。
Java
1//toStringがオーバーライドされているクラス 例.ArrayList 2List<String> list = new ArrayList<>(); 3list.add("A1"); 4list.add("A2"); 5System.out.println(list.toString());//[A1, A2] が出力->中身をわかりやすく表示する実装になっている 6//toStringがオーバーライドされていないクラス 例.SimpleDateFormat 7SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd"); System.out.println(sdf.toString());//java.text.SimpleDateFormat@fbb536c0 が出力
なぜObjectクラスのデフォルトtoStringメソッドがこんなに不親切かというと"そのオブジェクトを文字列として(適切に)表現"する方法が汎用的な処理では難しいから(PHPのvar_dumpとかイメージしてるとありゃ、という感じです)。
でStringBuilderというクラスはどちらかというと、(2)のtoStringをオーバーライドしているクラスになる。例えばStringBuilderで文字列を連結した場合連結した文字列が出力結果になる
Java
1StringBuilder sb = new StringBuilder(); 2sb.append("A1"); 3sb.append("A2"); 4System.out.println(sb.toString());//A1A2 が出力
3.StringBuilderの存在意義
StringBuilderは文字列編集一般を扱うのが役割だが大概のことはStringクラスでも同じことができる。
先の文字列連結なら+でできるし、削除ならsubstringで切り出して再代入すればよい。
にも拘わらずStringBuilderが存在するのはStringだと加工が発生するたびオブジェクトが毎回newされるため。JavaSE5以前にはStringBufferなるものが文字列連結で使われていましたが、StringBuilderはスレッドの同期化を行わないため性能が良い。
※ここらへんに関心がありましたらまた別途。
投稿2017/06/27 06:15
編集2017/06/28 01:27総合スコア276
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/29 05:09
2017/06/30 06:04
0
to Stringはどのように使うかは様々ですので、
一例として下記を記載致します。
int型からString型へ変換するとき。
int i = 10;
Integer oi = new Integer(i);
String Str = oi.toString();
参照:javaDrive様
StringBuilderは文字列の不要な部分を削除したり、文字を置き換えたりするときに使用します。
こちらも一例になってしまいますが、ご了承願います。
削除する
StringBuilder str = new StringBuilder("あいうえお");
str.delete(0,2);// 1文字目、2文字目を削除する
System.out.println(str);
【表示内容】
うえお
わかりにくかったらすみません。
投稿2017/06/27 01:33
総合スコア64
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
kurokobaさんの回答が詳しいのですが、1つだけひっかることが、
間違いではないのですが、勘違いしそうな表現ありましたので。
StringBuilderというクラスはどちらかというと、(2)のtoStringをオーバーライドしているクラス
- toStringは、そのオブジェクトの文字列表現です。(kurokobaさんの説明で十分)
- StringBuilderは、Stringを作る便利クラスです。
なので、StringBuilderにappendをしたオブジェクトのtoStringは、
Stringがくっついたものを返すようにオーバーライドされています。
StringBuilderは文字列編集一般を扱うのが役割だが大概のことはStringクラスでも同じことができる
正しくは「同じこと」ではなく、「同じようなこと」です。
というのも、Stringは不変オブジェクトであり編集できません。
kurokobaさん自身も書いてますが見逃されないように。
Stringだと加工が発生するたびオブジェクトが毎回newされる
新しいStringが生成されます。(実は完全に生成か?というと深い話なのでやめます)
投稿2017/06/29 05:27
総合スコア4820
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。