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

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

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

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

Q&A

解決済

7回答

608閲覧

StringBuilderを使った文字の連結について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/03/11 09:16

StringBuilderappnedが予想していた動きになりません。

StringBuilderインスタンスをforの外で生成した場合

Java

1public class Main { 2 public static void main(String[] args) { 3 StringBuilder sb = new StringBuilder(); 4 5 for (int i = 0; i < 10; i++) { 6 System.out.print(sb.append("■")); 7 } 8 } 9}

予想していた動き

  1. StringBuilderインスタンスが生成されてsb = nullになる
  2. int = 0のときにsb = nullに■が1つ追加されsb = ■
  3. int = 1のときにsb = ■に■が1つ追加されsb = ■■
  4. int = 3のときに以下略

というようにforの条件式の右辺の数の分だけ■が表示されると思っていました。

StringBuilderインスタンスをforの中で生成した場合

Java

1public class Main { 2 public static void main(String[] args) { 3 for (int i = 0; i < 10; i++) { 4 StringBuilder sb = new StringBuilder(); 5 System.out.print(sb.append("■")); 6 } 7 } 8}

予想していた動き

  1. StringBuilderインスタンスが生成されてsb = nullになる
  2. int = 0のときにsb = nullに■が1つ追加されsb = ■
  3. StringBuilderインスタンスが生成されてsb = nullになる
  4. int = 1のときにsb = nullに■が1つ追加されsb = ■

というようにforの条件式の右辺の数の分とは関係なく最終的には■が1つ表示されると思っていました。

わからないこと

  • StringBuilderインスタンスをforの外で生成したコードが、なぜ55個になるのかがわかりません
  • StringBuilderインスタンスをforの中で生成したコードはsbが都度 New されてnullで上書きされると思っていたのに、なぜ10個表示されるのかがわかりません

以上、2点です。アドバイスのほど、よろしくお願いたします

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

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

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

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

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

guest

回答7

0

ベストアンサー

StringBuilder sb = new StringBuilder(); がなにをしてるかしってるか?

それがわかれば治せるよ

あと 1+2+3+4+5+6+7+8+9+10 も計算してみよう

for 外で初期化した場合の動作と同じ結果になる処理

// 1+2+3+4+5+6+7+8+9+10 System.out.print("■"); System.out.print("■■"); System.out.print("■■■"); System.out.print("■■■■"); System.out.print("■■■■■"); System.out.print("■■■■■■"); System.out.print("■■■■■■■"); System.out.print("■■■■■■■■"); System.out.print("■■■■■■■■■"); System.out.print("■■■■■■■■■■");

for 内で初期化した場合の動作と同じ結果になる処理

// 1+1+1+1+1+1+1+1+1+1 System.out.print("■"); System.out.print("■"); System.out.print("■"); System.out.print("■"); System.out.print("■"); System.out.print("■"); System.out.print("■"); System.out.print("■"); System.out.print("■"); System.out.print("■");

print :出力時に改行を含まないメソッド
println :出力時に改行を含むメソッド
printf :出力時にフォーマットを利用するメソッド

投稿2018/03/11 09:19

編集2018/03/11 11:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

swordone

2018/03/11 11:07

×出力事 〇出力毎
退会済みユーザー

退会済みユーザー

2018/03/11 11:29

出力事→出力時 だったり(そっちでもありだけど)  うあーーん
退会済みユーザー

退会済みユーザー

2018/03/12 02:13

StringBuilderの動きが知りたくてリファレンスを読んだのですが、なぜ StringBuilder が for の中にあるときには■が10個表示され、外にあるときには55個表示されるのかがわかりません。 print と println の改行の有無があることをうっかり忘れていたのですが上記 StringBuilder の動きがまだわかっていません。都度 New されると空文字で初期化されると思いきや■は10個表示されるのが腑に落ちません。
退会済みユーザー

退会済みユーザー

2018/03/12 02:27

今、ふと思ったのですが、もしかして StringBuilder を for の中に書いた場合10回ループして 出力しているので10個あるように見えますが実際の変数 sb の中身は■が1個なのでしょうか? 試しに for の外で sb を出力しようと思ったのですがローカル変数を覗けなくて出力できませんでした。
退会済みユーザー

退会済みユーザー

2018/03/12 03:15

for 内で初期化してるのは後者ので 1+1+1... で10ですよ
退会済みユーザー

退会済みユーザー

2018/03/12 04:02

StringBuilder が毎回初期化されているのに合計が10になるのが理解できていません。なぜ中身が空にならないのでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/12 08:10

asahina1979さんがおっしゃっているのは print された■が1+1+1+...で計10表示されているという意味で合っていますか?
guest

0

予想していた実行結果は次のとおりでしょうか?

■ ■■ ■■■ ■■■■ ■■■■■ ■■■■■■ ■■■■■■■ ■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■

このとおりにならないのは出力する際に改行していないからです。
System.out.printではなくprintlnを使えば想像通りに動作すると思います。

ついでに

次の二つは意味が全く違います。

  • StringBuilder sb = new StringBuilder();
  • StringBuilder sb = null;

投稿2018/03/11 09:20

編集2018/03/11 09:25
LouiS0616

総合スコア35660

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

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

KSwordOfHaste

2018/03/11 09:42 編集

to: 質問者さん LouiS0616さんの「ついでに」のところですが、質問者さんの意図は「StringBuilderインスタンスの内容に文字列が何もない」といいたかったのだろうと思います。確かにnullとかnilは何もないことを表す一般用語ですがJavaプログラムの話題でその言葉を目にしたとき、大抵の読者はJavaのnullであると認識しますので混乱を招きます。「空」とか「empty」とか「空文字列」というべきだろうと思います。 (自分も見た瞬間にLouiS0616さんと同様の違和感を感じました。プログラマーという人種はこういう違和感には敏感です。コミュニケーションが不正確になるとバグの原因になるからと思います。)
退会済みユーザー

退会済みユーザー

2018/03/12 02:19

改行のせいで1から10の和が全て表示されてしまったのは、うっかりしていました。ただ、StringBuilder を書く位置が for の中と外でそれぞれ違う動きをしますが、なぜ中に書いた場合空文字で上書きされないのかが腑に落ちません。 >KSwordOfHasteさん null はなにもない「空」ととらえていました。null は null なんですね。
momon-ga

2018/03/12 03:15

nullだったら、append時にNullPointerExceptionが発生しますので。
LouiS0616

2018/03/12 04:37

@javacurry さん 空文字で初期化した後に■をappendしているからでは?
退会済みユーザー

退会済みユーザー

2018/03/12 08:07

やっと腑に落ちなかった部分が見えてきました
guest

0

StringBuilderインスタンスをforの中で生成したコードはsbが都度 New されてnullで上書きされると思っていたのに、なぜ10個表示されるのかがわかりません

new StringBuilderをfor文の中に書いた場合、

(1) StringBuilder sb = new StringBuilder(); ← 空のStringBuilderができる。
(2) sb.append("■") ← sbの中身が■になる。
(3) (2)をprint() ← ■が出力される。

を10回繰り返しています。
sbの中身が■×10なのではなく、■×1のsbを10回printしているから出力が■×10になっています。

投稿2018/03/12 05:08

YamakawaJunichi

総合スコア630

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

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

退会済みユーザー

退会済みユーザー

2018/03/12 08:05

sb の中身を10だと思っていたので混乱していたのですが実際は1だったんですね
guest

0

java

1System.out.print(sb.append("■"));

の部分を

java

1System.out.println("sbの中身は" + sb.append("■") + "です。");

に変えて実行すればわかるでしょうか?

for内で初期化した場合は毎回中身が空になる、という質問者さんの認識は正しいです。

投稿2018/03/12 07:18

編集2018/03/12 07:18
takara7

総合スコア107

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

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

退会済みユーザー

退会済みユーザー

2018/03/12 08:06

みなさんのおかげでモヤモヤが解決してきました
guest

0

java9 の jshell で実験をしてみると、いろいろわかるかもしれません。

  • StringBuilderインスタンスが生成されてsb = nullになる

==> なりません。
イメージ説明

  • print と println の差

イメージ説明

  • for で実際に print と println を比べる。

イメージ説明

投稿2018/03/11 11:23

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2018/03/12 04:21

Jshell を使ってみました。文字化けしてますが確かに null を確認できました。今まで空文字と null を同じに考えていました
guest

0

StringBuilderインスタンスが生成されてsb = nullになる

null にはなりません

投稿2018/03/11 10:12

y_waiwai

総合スコア87749

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

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

退会済みユーザー

退会済みユーザー

2018/03/12 04:22

勘違いしていました。確認したところ空文字でした
guest

0

java

1public class Main { 2 public static void main(String[] args) { 3 StringBuilder sb = new StringBuilder(); 4 5 for (int i = 0; i < 10; i++) { 6 System.out.print(i + ": " + sb.append("■")); 7 } 8 } 9}

java

1public class Main { 2 public static void main(String[] args) { 3 for (int i = 0; i < 10; i++) { 4 StringBuilder sb = new StringBuilder(); 5 System.out.print(i + ": " + sb.append("■")); 6 } 7 } 8}

これで実行してみ

投稿2018/03/11 12:20

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2018/03/12 04:19

StringBuilder の位置が外の場合は append が10回繰り返されて計10になるのはわかったのですが、なぜ for の中に書いた場合に毎回 New されているにもかかわらず中身が空にならず計10になるのでしょうか?
swordone

2018/03/12 05:01

だから私のコードを実行してみ。 何が起こっているのかわかるから。
退会済みユーザー

退会済みユーザー

2018/03/12 08:04

実行はしていたのですが腑に落ちていませんでした。何度も見直してやっと気づいたのですが sb の中身の■は10個ではなく1個で、それが print されていたんですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問