質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

6704閲覧

Java toString メソッドについて

kawajin213

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2017/06/26 13:34

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
現在java se8 sliverの勉強をしているのですが、よく出てくるStringBuilderとtoString についてわかりやすく教えていただければ幸いです。

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/06/26 13:52

漠然としすぎです。何が知りたいのか具体的に。
kawajin213

2017/06/26 13:54

すいません。そうですよね。私が聞きたいのは、どういうときにtoStringを使い、またそれはどういう役割をなすかということです。
guest

回答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
kurokoba

総合スコア276

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawajin213

2017/06/29 05:09

わかりやすく説明していただきありがとうございました。勉強になりました。
kurokoba

2017/06/30 06:04

(一応補足) 「java se8 sliver」の勉強とのことですが一応ホットな話題でこれに触れなかったのは気持ち悪いので...。先日待ったをかけられてたProject Jigsawが可決し、予定通りだとたしかJavaSE9は9月リリースの予定です。この中にStringの性能改善が含まれており、Stringの省メモリ化、”+”の性能向上などが入ってきます(回答に記載したような問題があるから改善する必要があるのですが)。earlyAccess版ではStringの"+"がStringBuilderの性能を上回ったという話も聞きます。参考までに。
guest

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

Akihito_Jv

総合スコア64

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご指摘ありがとうございます。言い回しには気を付けてはいるつもりですが、たしかに表現が微妙です。
※そういえば先日Jigsawが可決されてJavaSE9のリリースが見えてきましたが、たしかStringの性能改善(連結含む)がはいる予定だったはず...。

投稿2017/06/30 05:36

kurokoba

総合スコア276

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

to string = 文字列に
つまり、文字列に変えたいときに使うメソッド

投稿2017/06/26 14:14

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問