こんにちわ。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=742689
に似たような質問がございましたが・・・
関連書籍やサイトのいずれを見ても、
「Stringクラスは文字列の内容を変更することは出来ない」
と書いていますが・・・
String str1;
String str2;
str1="こんにちわ";
str2="さようなら";
str1=str1+str2;
System.out.println(str1);
とコーディングすると、何事もなく、
「こんにちわさようなら」
と出力されます。
そうなると、StringBufferクラスのappendメソッドをわざわざ使用しなくてもよくなるのですが、
これは、どのように解釈すればよいのかご存知の方がおりましたら、ぜひ、教えてください。
以上、宜しくお願いいたします。
No.2ベストアンサー
- 回答日時:
str1 のような変数は、参照型と言って、自身がその内容なのではなくて、オブジェクトを参照しています。
>str1=str1+str2;
の場合、str1+str2 で新しくString オブジェクトが作成されて、それに対する参照に付け替えられます。
StringBufferクラスのappendメソッド を使うかどうかは、
領域を再利用するかどうかで検討すればいいでしょう。
(String を使った場合は新しく作っては古い領域が捨てられるので、追加するような場合に速度的に不利です)
新しく作っては古い領域が捨てられるから、パフォーマンスに影響が出るんですね。
箱の中身を入れ替えるのではなくて、箱を次々と作成しては破棄するようなものだと言うことですよね?
回答、ありがとうございました。
勉強になりました。
No.3
- 回答日時:
StringはJavaのクラスの中で明示的にオブジェクトを作成しなくてもよい極めて特殊なクラスです。
ですので非常に理解しにくいと思います。str1="こんにちわ";
str2="さようなら";
str1=str1+str2;
は
str1 = "こんにちわ";
str2 = "さようなら";
str1 = (new StringBuffer(str1)).append(str2).toString();
と言う記述をしなければらならないところを、特別に省略形を許しているのです。こんな記述を許すオブジェクトはStringのみです。
上記の2表現のどちらにせよ、イコール演算子を使用してオブジェクトを代入しなおしています。新しくオブジェクトを生成してそのオブジェクトを代入しているのです。
またStringの持つどのメソッドを実行しても、その内部表現そのものを変更することは不可能で、戻り値として返された値を代入しなければいけません。
例えば
str1.trim();
と記述しても内容は不変であり
str1 = str1.trim();
としなければならないのです。
一方StringBufferは自分の持つメソッドを実行することにより、内部表現を変更しています。代入はいらないのです。
回答ありがとうございました。
確かに理解しにくいですね。
単に「変更できない」と覚えるのではなく、
内部表現を変更できるのがStringBuffer、
内部表現を変更できないのがString、
と理解するのが、いいのですね。
・・・本当に理解しにくいです。
皆さんのおかげで、少し、理解が深まりました。
ありがとうございました。
No.1
- 回答日時:
この質問の回答にもあるように、
Stringの内部でもっている文字列オブジェクトが可変であるということです。
str1=str1+str2;
とした場合でも、
str1とstr2を結合した新しい"こんにちわさようなら"という新しいStringインスタンスが生成されます。
もともとあったstr1のインスタンスの内容が変わるのではなく、
あくまでもstr1という変数ののインスタンスを指す参照先が変わるだけです。
で、文字列の編集ですが、+を使って編集したとしても、
これはコンパイラによってStringBufferを使ったコードに最適化されるそうです。
一般的に、+を使ったStringの連結はパフォーマンスが遅いと言われてます。
そのため、一般的にはStringBufferを使うことを推奨されていますが、最近のJDKバージョン1.4以降は、昔ほどのパフォーマンスの違いはそれほどありません。
回答ありがとうございました。
つまり、正式にはやはりStringBufferなんですね。
「この場合、もともとあったstr1のインスタンスの内容は、どこに行っちゃうのだろう?」
と考えると、なんだか、狐につままれたような気分ですが、なんとなく、わかりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- その他(自然科学) 信頼度がR1、R2の機器を並列に接続した場合、システム全体の信頼度はどれか。答え1-(R1)(1- 2 2023/01/15 21:45
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- FTTH・光回線 ビッグローブ光とルーターの相性 2 2023/03/18 19:44
- テレビ ひかりTVのBS4K視聴について(テレビ2台目) 2 2022/12/02 20:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 放射線治療・リハビリテーション リハビリ系のお仕事についてです。 将来、リハビリ系のお仕事につきたいと思っているのですが PT、OT 1 2022/05/21 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サーブレットコンテキストの意...
-
Objectクラスのオブジェクトを...
-
VB.NETでのnothing の意義について
-
JTableで値を右寄せ表示する方法
-
JSPでのArrayListの表示につい...
-
エクセルVBA 画像を貼り付ける...
-
[ASP.NET]DropDownListのDB連携...
-
servletからjspへオブジェクト...
-
vectorの内容をString型に変換...
-
ピクチャーボックスに点を打つ...
-
VB.netでメソッドからコントロ...
-
GridViewに行追加するには?
-
VBAでの[]
-
オブジェクトの参照渡しについて
-
getParameter()について
-
UTF-8のテキストファイルを開く...
-
String型からlong型への変換は...
-
MIME::Parserのparse_dataメソ...
-
VBA Workbooks.open
-
Excel VBA 定数にオブジェクト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでの[]
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
Vba ListViewの行挿入に関して...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
javaで、、、
-
VB.NETでのnothing の意義について
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
VBスクリプトでテキストファイ...
-
String型からlong型への変換は...
-
JSPでのArrayListの表示につい...
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
エクセルVBA/SpecialCellsで特...
-
getParameter()について
-
VBS でのソート処理Excel2003
おすすめ情報