• ベストアンサー

生成されるStringオブジェクトは2つ3つ??

http://www.okweb.ne.jp/kotaeru.php3?q=716958 以前質問した内容について、またわからなくなりました。 「STRINGオブジェクトはいくつ作成されますか? String a,b,c; a="1234"; b=a; c=a+b; 」 で、答えはA=B="1234"のひとつと c="12341234"のひとつで、計2つ、ということなんですが・・・ たとえばOkwebクラスがあったとして Okweb ok = new Okweb(); Okweb goo = ok; この場合には生成されるオブジェクトは1つというのはわかります。 gooにも参照が渡されたというだけで、あくまでもひとつということですよね。それは、okに変化があったとき同時にgooも変化することでわかります。 ここで例の問題に戻ります。 加えて b="5678"; として確認(println等で)してみますと、 a="1234",b="5678" となっています これは a=b=1234ではなくて a=1234 b=1234 というようにあくまでもaとbは違うStringオブジェクトであるということを示しているといえないのでしょうか? よろしくお願いします教えてください

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.1

String a, b; a = "1234"; // "1234"というオブジェクトを作って、 // それをaが参照 b = a; // aと同じオブジェクトをbが参照 b = "5678"; // "5678"というオブジェクトを新しく作って、 // それをbが参照。 // b = new String("5678") と同じ 納得していただけましたでしょうか?

azicyan
質問者

お礼

ありがとうございます。 一旦はわかったはずだったんですが・・・(^_^;) あくまでも 変数=”abc" とした時にオブジェクトは作られるということですね。

その他の回答 (1)

  • mi-si
  • ベストアンサー率35% (200/567)
回答No.2

Java言語の中でもString Objectは特殊な扱いをされています。 a="1234";/* (1) */ b=a;/* (2) */ b="5648";/* (3) */ は、Javaコンパイル内部では、 a = new String("1234");/* (1') */ b = a;/* (2') */ b = new String("5678");/* (3') */ と言う様に置き換えられています。 つまり、 1' で、aに、Object (1')を参照, 2' で、bは、aと同じObjectを参照。(Object (1')を参照) 3' で、bのObject (1')への参照は破棄され新たにCreateされたObject (3')を参照する。 つまり、(2)の後のaとbは同じObjectを参照してますが、(3)の後のaとbは別のオブジェクト参照しています。

azicyan
質問者

お礼

ありがとうございます。 たすかりました!

関連するQ&A

  • stringオブジェクト

    あるテキストの問題に 「STRINGオブジェクトはいくつ作成されますか? String a,b,c; a="1234"; b=a; c=a+b; 」 というのがあったんですが、答えは2個でaとb。 cはストリング文字列だから、という答えでした・・・ えーーー?!? とびっくりしてしまいました。 なぜなら、"1234"というのも文字列だと認識していたからです。 StringオブジェクトとString文字列の境目は何ですか?

    • ベストアンサー
    • Java
  • Stringオブジェクトについて

    ある参考書では、Java のメモリー使用効率を改善するために、JVM は「String 定数プール」と呼ばれる特別なメモリー領域を確保していると書いてあり、String を作成する例として次の2つのパターンのコードについて説明している(この例では、定数プール内にほかのString は存在しないものとしている)。 ・パターン(1) String s = "abc"; // 1つのString オブジェクトと         // 1つの参照変数を作成する この例では、"abc" がプールに納められ、変数s がそれを参照する。 ・パターン(2) String s = new String("abc"); // 2つのString オブジェクトと                  // 1つの参照変数を作成する。 このコードでは、new キーワードを使ったので、新しいString オブジェクトが標準の(プールでない)メモリー上に作成され、変数s がそれを参照する。さらに、リテラル"abc" がプールに収められる。  そこで質問ですが、パターン(2) で、変数s と2つのオブジェクトはそれぞれ互いにどのような関係(メモリー上の関係も含めて)を持っているのか。 例えば変数s に対してプリント命令を出したときにJVM はこの2つのオブジェクトに対してどのような処理をするのか。 またこれらのオブジェクトのhashcode はどうなっているのでしょうか。どなたか教えてください。

  • JavaのStringの比較について

    お世話になります。 String string1 = new String("あいうえお"); //(1) String string2 = new String("あいうえお"); //(2) String string3 = "あいうえお"; //(3) String string4 = "あいうえお"; //(4) System.out.println(string1 = = string2); //(5) System.out.println(string3 = = string4); //(6) 実行結果 false true (5)がfalseになるのは分かるのですが、(6)がtrueになるのはなぜでしょう?また、(1)や(2)のようなStringオブジェクトの生成方法と(3)や(4)のようなStringオブジェクトの生成方法の違いは何でしょう? よろしくご教授ください。

    • ベストアンサー
    • Java
  • オブジェクトの参照渡しについて

    メソッドの引数にオブジェクトを指定した場合、 それは「参照渡し」だと理解していました。 でも以下のプログラムでは、指定したオブジェクトに変化がありません。 public static void main(String[] args) { BigDecimal b = new BigDecimal(1); System.out.println(b); test(b); System.out.println(b); } public static void test(BigDecimal b) { b = new BigDecimal(2); } 出力は以下です。 ------------------------- 1 1 ------------------------- どういうことでしょうか? 正しい知識をお教えください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 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になるはずなんですが、、、。 適切な回答をいただきたく思います。よろしくお願いいたします。

  • Listオブジェクトを連結し、新しいListオブジェクト生成

    2つのListオブジェクトを連結して、 新たに1つのListオブジェクトを生成するのは、 どうすればいいのでしょうか? 1. ListオブジェクトA 2. ListオブジェクトB 3. ListオブジェクトC(1.と2,を連結して新規生成) ※1と2には全く変更を加えない。 また、この方法は、パフォーマンスが重くなるでしょうか?

    • ベストアンサー
    • Java
  • オブジェクトの生成

    C++におけるオブジェクトの生成ですが、 普通の変数と同様に宣言するの方法と、 newを使用して動的に生成する方法があります。 色々調べてみて、理屈では判ったつもりなのですが、 newで動的にメモリに確保する、 と言う事の使いどころが、今ひとつピンときません。 どの様な場合、実行時にどれだけメモリが必要かわからないのでしょう? ちなみに、私は、Cではバッチ処理の開発を主に行ないましたが、或いは、クライアント/サーバ系などでは必須なのでしょうか? 宜しくお願い致します。

  • オブジェクトの参照およびハッシュコードについて

     下記のプログラムは任意のクラスMoofおよびStringクラスについてそれらのオブジェクトの参照値とハッシュコードをプリントし、さらにStringオブジェクトの参照値同士の比較をしています。 次の質問に対して分かりやすくご教示ください。 (1)Moofオブジェクトについては参照値そのものの値を出力しているようですが、Stringオブジェクトの場合はオブジェクトの値(abc)が出力されているのは何故ですか (2)参照値の構成は(クラス名+@+16進ハッシュコード)であり、オブジェクト(インスタンス)のあるアドレスを指し示すと聞きました。Stringオブジェクトは2つあってその値はabcで等しいのでハッシュコードも同じになっている訳ですが、もしハッシュコードがアドレスを示すとすると2つのオブジェクトに対してアドレスは1つとなりますが… (3)上の(2)に関連して参照値four、fiveに関するオブジェクトのハッシュコードはともに0x17862で等しいのですが、両者を==演算子で比較するとfalseとなります。 これはどうしてですか。  どなたか詳しい方、よろしくお願いします。 public class EqualsCheckX { public static void main(String[] args) { Moof one = new Moof(8); Moof two = new Moof(8); Moof three = one; int a = one.hashCode(); int b = two.hashCode(); int c = three.hashCode(); String four = new String("abc"); String five = new String("abc"); String six = four; int d = four.hashCode(); int e = five.hashCode(); int f = six.hashCode(); System.out.println("Moof " + " one : " + one + " two : " + two + " three : " + three); System.out.println("String" + " four : " + four + " five : " + five + " six : " + six); System.out.println(); System.out.println("hashCode" + " one : " + Integer.toHexString(a) + " two : " + Integer.toHexString(b) + " three : " + Integer.toHexString(c)); System.out.println("hashCode" + " four : " + Integer.toHexString(d) + " five : " + Integer.toHexString(e) + " six : " + Integer.toHexString(f)); System.out.println(); // String if (four == five) { System.out.println("String : four and five are equal"); } else { System.out.println("String : four and five are not equal"); } if (four == six) { System.out.println("String : four and six are equal"); } else { System.out.println("String : four and six are not equal"); } } } class Moof { private int moofValue; Moof(int val) { moofValue = val; } } C:\MyJava>java EqualsCheckX Moof one : Moof@1ac04e8 two : Moof@765291 three : Moof@1ac04e8 String four : abc five : abc six : abc hashCode one : 1ac04e8 two : 765291 three : 1ac04e8 hashCode four : 17862 five : 17862 six : 17862 String : four and five are not equal String : four and six are equal

  • 「オブジェクト参照渡し」と「参照渡し」の違いを

    ▽PHP: オブジェクトと参照 - Manual   http://jp.php.net/manual/ja/language.oop5.references.php $a = new A; $b = $a; // $a と $b は同じ ID を持つコピーです // ($a) = ($b) = <id> $c = new A; $d = &$c; // $c と $d は参照です // ($c,$d) = <id> とありますが、 ($a) = ($b) = <id> ($c,$d) = <id> の違いを目で見て確認できるような簡単なサンプルコードはないでしょうか? echoとかで中身を出力して、確かに違っているな、と言うのを確認してみたいのですが……

    • ベストアンサー
    • PHP
  • Javaのプログラミングにおいて、暗黙的にオブジェクトが生成される場合はどんな場合ですか?

    Javaアソシエイツの資格取得ため、勉強しています。詳しい解説を求めています。 ■問題 次のプログラムを実行すると、出力結果はどのようになりますか。1つ選択してください。 http://d.hatena.ne.jp/motoi20/20081210 ■解説 正解は選択肢Aです。func(s)では、変数sが参照しているStringオブジェクトを「func(Stirng s)」の引数sに渡しています。func()メソッドの処理で「s+"Hello"」という処理をしたとき、内部では暗黙的に新しいStringオブジェクトが生成されます(変数sに文字列を追加しているわけではありません。)func()メソッドの呼び出しが「s=func(s)」となっていた場合、main()メソッド内の変数sが新しくできたオブジェクトを参照するため、結果の出力は「JavaHello」になりますが、「func(s)」の呼び出しでは戻り値を再代入していないため、変数sは文字列「Java」を保持したオブジェクトを参照します。Stringクラスは読み取り専用オブジェクトであることに注意しましょう。 ■疑問 通常、オブジェクトを作成するのは、「new」を使って行うわけですよね?暗黙的にオブジェクトが生成されるのは、どういう場合でしょうか?読み取り専用オブジェクトだから何に気をつければいいのでしょうか?

専門家に質問してみよう