- ベストアンサー
java 配列について
public class Sample{ public static void main( String[ ] args ){ String x = "pen"; String[] y = new String[1]; y[0] = x; x = "pencil"; System.out.println(y[0]); } } java初心者です。 配列の参照先を変更して 配列の数を変更せず配列0に 実行時にpencilと表示させたいのですが よい方法はありますでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Javaの配列は「参照」を保持します。 JavaのStringは「定数」です。 x="pencil"; として、xの値である文字列を変更したつもりでも、 実際にはxの参照先を変更しているに過ぎません。 確かに上記の説明を「変数xに文字列"pencil"を代入」 などという説明をしている書籍も目にしますが、 「文字列"pencil"の参照を代入」が正しいと思います。 はじめは理解しづらいかもしれませんがその内馴れます。 で、配列はxの参照先が"pencil"の参照へ変更されたと しても、保持している参照先は"pen"の参照のままですの で、System.out.println(y[0]); としたところで出力 されるのは"pen"ということになります。 #3の方が提示したのは、配列が保持している"pen"の 参照を"pencil"の参照に置きかえる方法です。 で、私は配列に保持されている参照を変更せずに参照先 の値を変更する方法です。 定数であるStringではその様な事は不可能ですので、 StringBufferを使ってみてはと提案しました。 StringBufferクラスの存在意義は「参照を変更せずに 文字列内容を変更・操作できる」ところにあります。 >インデックスを指定しないとどうもコンパイルエラー >になるようでした。 失礼しました。 >Stringにもreplace()がありました。 >どのように使い分けたらいいのかな? メソッド名は同じですが、StringとStringBufferには 継承関係もありませんし別物です。 新たに文字列オブジェクトを「作る」のか、元の文字列 を「変更」するのかによって使い分けてください。
その他の回答 (3)
- gahahei
- ベストアンサー率13% (3/22)
y[0]=x; //y[0]には"pen"が格納 x= "pencil"; //xには"pencil" System.out.println(y[0]); //xは"pencil"だが、y[0]は"pen"のまま >配列の参照先を変更して でも、配列1こしかないよ?(new String[1]) >配列の数を変更せず配列0に ただ単にy[0]に今度は"pencil"を代入したいだけなら String x = "pen"; //xには初め"pen"が入っている String[] y = new String[1]; //配列は1つ y[0] = x; //y[0]には"pen"を代入 System.out.println(y[0]); //"pen"を表示(現在のy[0]は"pen") x = "pencil"; //xに"pencil"を代入 y[0] = x; //y[0]に"pencil"(x)を代入 System.out.println(y[0]); //"pncil"を表示 と、いう事? 勘違いしてたらごめんなさい。
お礼
ありがとうございました。 上記の方法で確かに確認とれました。 説明付きで助かりました。 配列と代入を逆に考えればよいですね?
- takaP-
- ベストアンサー率79% (83/105)
StringではなくてStringBufferを使ってはどうでしょう。 StringBuffer x=new StringBuffer("pen"); StringBuffer[] y=new StringBuffer[1]; y[0]=x; x.replace("pencil"); System.out.println(y[0]);
お礼
StringBuffer を使用する考え方もあるようですね。 大変参考になりました。ありがとうございました。 早速上記でためしてみたら、インデックスを指定しないとどうも コンパイルエラーになるようでした。 x.replace(0,3,"pencil"); Stringにもreplace()がありました。 どのように使い分けたらいいのかな?
- --neiro--
- ベストアンサー率15% (22/139)
javaは専門では有りません事を先に伝えさせて頂いた上でアドバイスさせて頂きます。 件の様な場合、ポインタを使ってみてはいかがでしょうか? y[0] = x; のところを y[0] = &x; とすれば良いのではないかと思われます。 参考URLを参照してみてください。
お礼
アドバイスありがとうございました。 早速試してみました。 どうもy[0] = &x; がうまくいかないようです。 ホームページをみてみたのですが、どうもjavaではなくC++のHP でした。 多分javaと扱い方が違うのかな?
お礼
いろいろお世話になりました。 大変勉強になりました。