• ベストアンサー

JavaのStringは

一端作成されると変更できないはずなのに String str=new String("the"); str.concat(" End."); でstrが"the"から"the End."に変更可能です。 これをどう考えたらいいのでしょうか?

  • keyguy
  • お礼率68% (895/1314)
  • Java
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 theは変更されたわけではなく、theはtheできちんとあります。 String str=new String("the"); str.concat(" End."); の場合、theとEndがくっついて新しいオブジェクトを生成してるので、theのオブジェクトを変更したわけではないんです。

keyguy
質問者

補足

ありがとうございます。 String str=new String("the"); str=str.concat(" End."); とかくべきでした。 この場合は最初のstrは捨てられて新たにStringが作られてその参照がstrに新たにセットされると言うことですね。

その他の回答 (3)

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.4

concat()メソッドは結合した文字列をさす新しいStringオブジェクトを返しオブジェクトの 値は変更しないはずです。 ですからご質問の変数strのデータは"the"のまま変更されません。 次のプログラムを実行していただければ別のオブジェクトであるのが確認できるかと思います。 class test{ public static void main(String args[]){ String str="Hello"; String str2=str.concat("Java"); System.out.println("str="+str); System.out.println("str2="+str2); System.out.println(str==str2); } }

keyguy
質問者

お礼

ありがとうございます。 質問に抜けがありました。 String str=new String("the"); str=str.concat(" End."); とすべきでした。 要するにstrが捨てられるのですね。

回答No.3

それは str.concat(" End."); の返値が"the End."になってるだけで、str自体は変更されていないのでは?

keyguy
質問者

お礼

ありがとうございます。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

二つの文字列をつなぎ合わせたStringが「新たに」作成され、返されます。

keyguy
質問者

お礼

ありがとうございます。

関連するQ&A

  • String定数プールと"==演算子"との関係。

    String str1 = new String("str1"); String str2 = new String("str1"); String str3 = "str1"; if(str1 == str2){    System.out.println("same!"); } if(str1 == str3){    System.out.println("same!"); } 上記のコードで実行すると、"same!"が実行されません。 Stringオブジェクトには定数プールがあって、新たにStringオブジェクトが作成されたとき、定数プールに入っているそれまでに存在していたStringオブジェクトの値と同じであったら、新たにStringオブジェクトを作らず、それまでにあったStringオブジェクトの参照を当てるということなのです。 それに従えば、str2,str3はstr1と同じStringオブジェクトを参照しているはずだから、if文の結果はtrueになるはずなんですが、、、。 適切な回答をいただきたく思います。よろしくお願いいたします。

  • new String

    まだHello Worldレベルです。 String str = new String("default"); if (x == y) str = new String("等しい"); のソースは問題無いですか? newで文字を作って、またnewで文字を書き替えているところが心配です。 String str = new String("default"); if (x == y) str = "等しい"; だと、それが無効だっから、new String("等しい");にしました。

    • ベストアンサー
    • Java
  • Stringオブジェクトの作成で理解できないことがあるので教えてもらえませんか?

    現在、Javaの資格勉強をしています。 (1)String str = "abc"; (2)String str = new String("abc"); この二つの作成の違いが理解できません。 (1)一つのStirngオブジェクトが作成されます。 (2)二つのStringオブジェクトが作成されます。 と記載してあります。単純にnew を使用すると二つ作成されると考えていいのでしょうか

    • ベストアンサー
    • Java
  • String型変数の宣言

    「String型変数の宣言で正しいものを2つ選べ (1)String str = "Hello"; (2)String str = 'Hello': (3)String str = new String("Hello"); (4)String str = new String('Hello'); (5)String str = "This is \n long String"; 」 答えは(1),(3)です。 なぜ5はだめなのですか??? コンパイルも通るし、実行もできますよね。

    • ベストアンサー
    • Java
  • JavaでString型をChar型に変換するプログラムが分かりません

    JavaでString型をChar型に変換するプログラムが分かりません;; どなかた助けて下さい。 下のプログラムの何がいけないんでしょうか?? いろいろ間違ってるところはあると思うんですが、教えて下さい! import java.io.*; class { public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); StringBuffer moji = new StringBuffer(str1); char nyuu=moji;

  • String型をbyte型へ

    MACアドレス(16進数) 00:00:00:00:00:01 これが引数で指定される。 String str = args[0]; というものがありまして(String型)、 そのコロン:で分けられた数字部分のみをバイト配列に格納したいのですが、そのうまい方法がわかりません。お助けください。 byte mac_addr[0] = Byte.parseByte("0x".concat(str.substring(0,1))); なんて事もしてみましたが、NumberForamtExceptionが 表示されます。(コンパイルは出来る。) うむ、分からない。どこが悪いのだろう??? 以上

    • ベストアンサー
    • Java
  • String型の変数を使った問題

    すごく簡単なプログラムのはずで、初歩的な質問で申し訳ありませんが、教えていただければと思います。 問題: 以下の場合の処理を行うプログラムを作成せよ。 (1)String型の変数を作成し、苗字を格納する。(値は直接書き込む) (2)String型の変数を作成し、名前を格納する。(値は直接書き込む) (3)(1)で作成した苗字を持つ変数と、(2)で作成した名前を持つ変数を結合して出力。 (4)「苗字は'((1)で作成した変数の値)'です。名前は'((2)で作成した変数の値)'です。」と出力。 出力結果: C:\>java Name いわたてつお 苗字は'いわた'です。名前は'てつお'です。 C:\> 上記のプログラムを作成しようとしたのですが・・・ import java.io.*; class Name { public static void main(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); String name1 = str1; String str2 = br.readLine(); String name2 = str2; System.out.println(name1 + name2); System.out.println("苗字は\'" + name1 + "\'です。名前は\'" + name2 + "\'です。"); } } ↑これではいくら変数を2つ作成しても、書き込んだ文字が全て 苗字の変数に格納されてしまってちゃんと出力出来ないという事は 分かるのですが、どうやったらちゃんと苗字と名前に分かれて 出力されるのか分からないので、教えてください。 なんとなく文法的にも間違っている気が・・・ ホント初歩的な質問ですみません!

    • ベストアンサー
    • Java
  • javaについて

    キーボードから入力をして、その後str[0][0]とstr[1][0]の文字を繋げたいのですがエラーとなってしまいます。どう変えたらよいでしょうか。 以下がプログラムです。 import java.io.*; import java.lang.*; import java.net.*; import java.awt.*; class gugu3 { public static void main(String[] args) throws IOException { int KEYWORDMAX=10; int CNTMAX=100; String [][]str = new String[KEYWORDMAX][CNTMAX]; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line=null; for (int i=0;i<KEYWORDMAX;i++){ System.out.println("第"+(i+1)+"番目のキーワードを設定しますか?(y/n)"); line=br.readLine(); if(line.equals("n")) break; for (int s=0;s<CNTMAX;s++){ System.out.println("キーワードを入力してください(終了=0)"); line=br.readLine(); if(line.equals("0"))break; str[s][i]=line; } } String keyword = new String(str[0][0]" "str[1][0]); System.out.println("キーワードは "+keyword); } } 以下はエラー表示です。 gugu3.java:24: ')' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: 文ではありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: ';' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ エラー 3 個

    • ベストアンサー
    • Java
  • stringのreplace

    import java.io.*; public class ex51c { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.print("String> "); String str= in.readLine(); if(str.equals("")) { break; } String res = ""; res =str.replace('a', '*') returns str.replace('e', '*') returns str.replace('i', '*') returns str.replace('o', '*') returns str.replace ('u', '*'); System.out.println(res); } } } このようなプログラムを作ってみたのですが、 コンパイル時にエラーが出ます。 どこを直せばいいのでしょうか。教えてください。

    • ベストアンサー
    • Java
  • javaのStringデーターの読込みについて

    javaのStringTokenizerを使用しました、ストリングデーターの読み取りに ついて質問します。 入力ファイルの200.0から800.0の7個のデーターは読取ることが出来ます。 次の行の200.0を読込みますと、『str=st.nextToken(); 』でエラーになります。 Q1)このエラーの原因について、コメント頂けますと大変助かります。 //入力ファイル 200.0 300.0 400.0 500.0 600.0 700.0 800.0 200.0 2000.0 4000.0 110 //ファイルの読取コード void fileIn_f_snd_chk_etc(){ String strX; String str; try{ File file = new File("c:\\TRSX700\\file_snd_chk_etc.txt"); if (myMsrCtlPanel.checkBeforeReadfile(file)){ BufferedReader bread = new BufferedReader(new FileReader(file)); int j=0; while((strX = bread.readLine()) != null){ //<----String[] values = str.split(" * ",0); StringTokenizer st=new StringTokenizer(strX," * "); //====================== for(int i=0; i<7; i++){ //ブランクは読み飛ばしている str=st.nextToken(); f_snd_chk[i].setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_snd_chk[i].getText()+" "); } // System.out.println(""); //ここまでは、正常読取 //====================== str=st.nextToken(); //ここでエラーになる f_imp_chk.setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_imp_chk+" "); //====================== str=st.nextToken(); f_dst_chk.setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_dst_chk+" "); //====================== str=st.nextToken(); f_fft_chk.setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_fft_chk+" "); //====================== str=st.nextToken(); key_data.setText(str); //fileIn_f_snd_chk_etc() System.out.print("f_imp_chk="+f_imp_chk.getText()+" f_dst_chk="+f_dst_chk.getText()+" f_fft_chk="+f_fft_chk.getText()+" key_data="+key_data.getText()); } //while bread.close(); } //if else{ System.out.println("ファイルが見つからないか開けません"); } } //try catch(FileNotFoundException e){ System.out.println("FileNotFoundException: "+e); } catch(IOException e){ System.out.println("IOException: "+e); } System.out.println("file_inの終了"); } //fileIn_f_snd_chk_etc() //以上

専門家に質問してみよう