JAVAアソシエイツの問題について

このQ&Aのポイント
  • JAVAアソシエイツの問題「SUN教科書 JAVAアソシエイツ P209 問5-7」からの問題についてです。
  • 次のプログラムの空欄(1)に入れて実行すると、出力結果がtrueになるコードはどれですか。
  • 正解はADFGです。AFGに関しては理解出来るのですが、どうして選択肢Dがtrueなのに選択肢Eはfalseになるのでしょうか。
回答を見る
  • ベストアンサー

JAVAアソシエイツの問題

「SUN教科書 JAVAアソシエイツ P209 問5-7」からの問題についてです。 次のプログラムの空欄(1)に入れて実行すると、出力結果がtrueになる コードはどれですか。4つ選択してください。 class Sample{ public static void main(String[] args){ String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); System.out.println( 【(1)】 ); } } A. s1 == s2 B. s1 == s3 C. s2 == s3 D. s1 == "Hello" E. s3 == "Hello" F. s1.equals(s3) G. s2.equals(s3) 正解はADFGです。AFGに関しては理解出来るのですが、 どうして選択肢Dがtrueなのに選択肢Eはfalseになるのでしょうか。 よろしくお願い致します。  

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

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.6

> 実務においてこの問題はどの程度重要なのでしょうか? 非常に重要です。 Javaにおいて「参照」がイメージできなければ, 文字列,配列も,異なるクラスにおける代入も, Javaコーディング上の多くの概念を理解できないことになりますから。 ---------------- 1: class Sample{ 2: public static void main(String[] args){ 3: String s1 = "Hello"; 4: String s2 = "Hello"; 5: String s3 = new String("Hello"); 6: System.out.println( 【(1)】 ); 7: } 8: } ---------------- >(5)そして、Stringオブジェクトが作成される順番により、 オブジェクトが作成される順番は関係ないです。 「番地」というイメージで適当な数値を仮定してみればよいかと。 ・3行目の"Hello" ・4行目の"Hello" ・5行目の"Hello" ・6行目の【(1)】に登場する"Hello" …すべて同一文字列なので同一オブジェクトとして確保される。  (仮に)1000番地を先頭にしてその"Hello"が確保されたとすると,  そのアドレスはすべて1000番地 ・new String("Hello") …1000番地に存在する"Hello"を複製元として,別番地を先頭に  新たな文字列を確保している。(仮に)2000番地とする。 3: String s1 = "Hello"; 4: String s2 = "Hello"; …参照変数s1とs2には「1000」が代入される。 5: String s3 = new String("Hello"); …参照変数s3には「2000」が代入される。 D. s1 == "Hello" …1000と1000を比較。結果はtrue E. s3 == "Hello" …2000と1000を比較。結果はfalse

taro_11
質問者

お礼

>>jjon-com様 詳細で丁寧な解説をありがとうございました。 番地を仮定する考え方はすごく分かりやすかったです。

その他の回答 (5)

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.5

オブジェクト型同士の比較演算子とは x == y 両者が同じオブジェクトなら ture、オブジェクトの値は比較せず x.equals(y) 両者が同じ値なら ture、オブジェクト自体は比較せず ソース内に直書きされた文字列(リテラル文字列)は、 効率化のために同じ値のものは同じオブジェクトと見なされます。 ゆえに "Hello" と書かれた部分は、全部同じオブジェクトと考えてください。 なので、 選択肢A : s1 と s2 は同じオブジェクト、x==y なので ture 選択肢B : s1 と s3 は違うオブジェクト、x==y なので false 選択肢C : s2 と s3 は違うオブジェクト、x==y なので false 選択肢D : s1 と "Hello" は同じオブジェクト、x==y なので ture 選択肢E : s3 と "Hello" は違うオブジェクト、x==y なので false 選択肢F : s1 と s3 は同じ値、x.equals(y) なので ture 選択肢G : s2 と s3 は同じ値、x.equals(y) なので ture 長くなりましたが要は「文字列の比較は equals を使え!」です。

taro_11
質問者

補足

【重複になります。ご了承して頂ければ幸いです。】 返信ありがとうございます。 申し訳ありませんが理解出来ませんでした。 私なりの解釈を記述させて頂きます。 (1)まず最初に「String s1 = "Hello";」により「Hello」が生成され、s1がそれを参照する。 (2)「String s2 = "Hello";」ではすでに「Hello」が存在してるので、新しくStringオブジェクトは 生成されず、s2もs1と同じ「Hello」を参照する。 (3)「String s3 = new String("Hello");」ではnew演算子を使って「Hello」を生成しているので、 s1とs2が参照しているStringオブジェクトとは別に新たに「Hello」を生成し、s3がそれを参照する。 (4)それゆえに選択肢Dはtrueとなります。 ここまでは合ってますでしょうか? (5)そして、Stringオブジェクトが作成される順番により、 「s1 == "Hello"」はまずtrueとなり、 s3はs1が参照しているHelloとは異なるオブジェクトを 指し示しているから「s3 == "Hello"」はfalseとなる。 上記のような考え方ではダメなのでしょうか? (ちなみに、実務においてこの問題はどの程度重要なのでしょうか?)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

#3にある図も参考にしてください。 この解説の載っていないJavaの入門書は無いはずです。 その教科書にも載っているのでは? 「文字列リテラルは、Stringのオブジェクトで、同じ内容のリテラルは同じオブジェクトになる」 このルールは、理解できていますか? > (1)まず最初に「String s1 = "Hello";」により「Hello」が生成され、s1がそれを参照する ここで生成される、というよりは、s1は「すでに存在する"Hello"オブジェクト」を参照する、という感じです。 以下、"Hello"とある文字列リテラルはすべて、「すでに存在する"Hello"オブジェクト(の参照)」です。 ちょっと疑似コードっぽくすると、こんなイメージ class Sample{ static final String リテラルHello = "Hello"; public static void main(String[] args){ String s1 = リテラルHello ; String s2 = リテラルHello ; String s3 = new String(リテラルHello ); // "Hello"を新しく生成するのではない。リテラルHelloと同じ内容の新規オブジェクトを生成する。 System.out.println( 【(1)】 ); } } 選択肢は D. s1 == リテラルHello E. s3 == リテラルHello このイメージができてれば > s3も「Hello」を参照している などとは考えないはずです。

taro_11
質問者

補足

【重複になります。ご了承して頂ければ幸いです。】 返信ありがとうございます。 申し訳ありませんが理解出来ませんでした。 私なりの解釈を記述させて頂きます。 (1)まず最初に「String s1 = "Hello";」により「Hello」が生成され、s1がそれを参照する。 (2)「String s2 = "Hello";」ではすでに「Hello」が存在してるので、新しくStringオブジェクトは 生成されず、s2もs1と同じ「Hello」を参照する。 (3)「String s3 = new String("Hello");」ではnew演算子を使って「Hello」を生成しているので、 s1とs2が参照しているStringオブジェクトとは別に新たに「Hello」を生成し、s3がそれを参照する。 (4)それゆえに選択肢Dはtrueとなります。 ここまでは合ってますでしょうか? (5)そして、Stringオブジェクトが作成される順番により、 「s1 == "Hello"」はまずtrueとなり、 s3はs1が参照しているHelloとは異なるオブジェクトを 指し示しているから「s3 == "Hello"」はfalseとなる。 上記のような考え方ではダメなのでしょうか? (ちなみに、実務においてこの問題はどの程度重要なのでしょうか?)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3
taro_11
質問者

補足

【重複になります。ご了承して頂ければ幸いです。】 返信ありがとうございます。 申し訳ありませんが理解出来ませんでした。 私なりの解釈を記述させて頂きます。 (1)まず最初に「String s1 = "Hello";」により「Hello」が生成され、s1がそれを参照する。 (2)「String s2 = "Hello";」ではすでに「Hello」が存在してるので、新しくStringオブジェクトは 生成されず、s2もs1と同じ「Hello」を参照する。 (3)「String s3 = new String("Hello");」ではnew演算子を使って「Hello」を生成しているので、 s1とs2が参照しているStringオブジェクトとは別に新たに「Hello」を生成し、s3がそれを参照する。 (4)それゆえに選択肢Dはtrueとなります。 ここまでは合ってますでしょうか? (5)そして、Stringオブジェクトが作成される順番により、 「s1 == "Hello"」はまずtrueとなり、 s3はs1が参照しているHelloとは異なるオブジェクトを 指し示しているから「s3 == "Hello"」はfalseとなる。 上記のような考え方ではダメなのでしょうか? (ちなみに、実務においてこの問題はどの程度重要なのでしょうか?)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

見落としがありました。 選択肢Aはtrue、 B,Cがfalseになるのは理解してるんですよね? それと同じ理由です。

taro_11
質問者

お礼

>>kmee様 返信ありがとうございます。 選択肢ABCDFGに関しては理解出来ております。 Sringオブジェクの生成される順序が、関係演算の判定に影響しているということなのでしょうか? 以下は私の考え方です。 (1)まず最初に「String s1 = "Hello";」により「Hello」が生成され、s1がそれを参照する。 (2)「String s2 = "Hello";」ではすでに「Hello」が存在してるので、新しくStringオブジェクトは 生成されず、s2もs1と同じ「Hello」を参照する。 (3)「String s3 = new String("Hello");」ではnew演算子を使って「Hello」を生成しているので、 s1とs2が参照しているStringオブジェクトとは別に新たに「Hello」を生成し、s3がそれを参照する。 (4)それゆえに選択肢Dはtrueとなります。 ここまでは合ってますでしょうか? まぎらわしいのはs3も「Hello」を参照しているので、 trueになり得るようにも解釈出来そうなのですが…。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

==とString.equalsメソッドの違い sx="Hello"とsx=new String("Hello")の違い 理解できていますか? 参考書などに、必ず載っているような重要な事です。 同じ内容でも、==ではない、というのは、よくあることです。

taro_11
質問者

補足

選択肢DとEの違いについて解説して頂ければ助かります。

関連するQ&A

  • Javaの参照型変数についての質問です。

    SUN教科書Javaアソシエイツ P209 問5-7より 次のプログラムの空欄(1)に入れて実行すると、出力結果がtrueになる コードはどれですか。4つ選択して下さい。 class Sample{ public static void main(String[] args){ String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); System.out.println(【  (1)  】) } } A. s1 == s2 B. s1 == s3 C. s2 == s3 D. s1 == "Hello" E. s3 == "Hello" F. s1.equals(s3) G. s2.equals(s3) 以上が問題です。正解の選択肢はA,D,F,Gです。 正解については理解出来ています。しかし、Eの選択肢もtrueに なると思うのですがどうしてfalseなのでしょうか。 s1とs2が文字列Helloを参照しているのは分かります。 しかし、String s3 = new String("Hello");で、 s3も文字列Helloのオブジェクトを生成しているのですから、 s3もHelloを参照していることになり、s3 == "Hello"も trueになると思うのですが…。 アドバイス、よろしくお願い致します。

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

    以下のプログラムで[\\D]+はどういう働きをしているのか分からないので教えていただけますでしょうか。 実行結果は 1990 と表示されます。 よろしくお願いいたします。 public class split{ public static void main (String[]args){ String s = "明日は1990年です。"; String [] str = s.split("[\\D]+"); for( String st: str ){ if( !st.equals("") ){ System.out.println( st ); } } } }

    • ベストアンサー
    • Java
  • javaプログラムについて

    mainメソッド内の指定された部分の処理を、 別のメソッドに分けてください。 mainメソッド内から作成した別メソッドを呼び出して 実行できるようにしてください。 ※分ける前と分けた後で処理結果が変わらないこと (入力された文字が"A"の場合true, それ以外の場合falseを返すように) */ class MethodAdd1{ public static void main(String[] args){ /* // ★ここから if("A".equals(args[0])){ judge = true; }else{ judge = false; } // ★ここまで */ boolean judge; if("A".equals(args[0])){ System.out.println("true"); }else{ System.out.println("false"); } } /* **戻り値:boolean **引数:String */ //ここにメソッドを作成 public static boolean equals(String a){ String str="A"; if("A".equals(str)){ return true; }else{ return false; } } } これで一応trueかfalseと表示されるのですが、合っているのか分かりません。 お時間のある方で、手直しをして頂ける方お願い致します。

  • Javaの参照型変数の比較についての質問です。

    SUN教科書Javaアソシエイツ P209 問5-8より 出力結果を問う問題です。 class A{String s = ”ABC”;} class Sample{ public static void main(String[] args){ A a1 = new A(); A a2 = new A(); if(a1 == a2){ System.out.println("a1 == a2"); } if(a1.s == a2.s){ System.out.println("a1.s == a2.s"); } if(a1.equals(a2)){ System.println("a1 equals a2"); } if((a1.s).equals(a2.s)){ System.out.println("a1.s equals a2.s"); } } } 【解答】 a1.s == a2.s a1.s equals a2.s 「a1.s」と「a2.s」の記述、つまり表記が意味している内容が良く分かりません。 a1とa2が別のオブジェクトであることは理解出来ています。 ですから、(a1 == a2)と(a1.equals(a2))がfalseとなるのも分かります。 ですが、「a1.s」の「.s」とは何なのでしょうか。 解説には「a1.sとa2.sはAクラスのオブジェクトが保持する同一のStringオブジェクトを 参照しています。」とあります。Aクラスを生成した時にその中にString型クラスsが 作れているということでしょうか。 アドバイスをよろしくお願い致します。

    • ベストアンサー
    • Java
  • javaプログラムについて

    */コマンドライン引数で2つの数字と1つの記号を受け取ります。 * //受け取った記号が『+』ならplusメソッドを呼び出し、 * //受け取った記号が『-』ならminusメソッドを呼び出し、 * //受け取った記号が『×』ならmultiplyメソッドを呼び出し、 * //受け取った記号が『÷』ならdivideメソッドを呼び出し、 * //それ以外が入力された場合は『計算できません。』と表示する * //プログラムを作成してください。 * */ public class MethodAdd9 { public static void main(String[] args) { int input1 = Integer.parseInt(args[0]); int input2 = Integer.parseInt(args[1]); String sign = args[2]; //ここにプログラムを追加してください if(sign.equals("+")){ plus(input1,input2);//プラスメソッドへ } if(sign.equals("-")){ minus(input1,input2);//マイナスメソッドへ } if(sign.equals("*")){ multiply(input1,input2);//掛算メソッドへ } if(sign.equals("/")){ divide(input1,input2);//割算メソッドへ } } // 四則演算を行うメソッドを追加 //プラスメソッド表示 public static void plus(int a,int b){ int c=a+b; System.out.println(a+b); } //マイナスメソッド表示 public static void minus(int d,int e){ int f=d-e; System.out.println(d-e); } //掛算メソッド表示 public static void multiply(int g, int h){ int i=g*h; System.out.println(g*h); } //割算メソッド表示 public static void divide(int j,int k){ int l=j/k; System.out.println(j/k); } } ここまで出来て、記号を認識してくれるようにはなったのですが、何故か"*"掛算の記号だけ読み込んでくれません。また、ここから「計算出来ません」と表示させるにはどうすれば良いでしょうか。知恵をお貸しください。

  • javaの参照渡しの問題

    javaの参照渡しの問題 javaの初心者で問題集で勉強しているのですが、 以下の問題の参照渡しの違いがわかりません。 ------------------------------------------- ソース1 class Samplea{ public void method(){ int b[] = new int[2]; set(b); System.out.println(b[0]); } public void set(int[] b){ b[0] = 30; } } class Sample{ public static void main(String srgs[]){ Samplea x = new Samplea(); x.method(); } } 実行結果 30 ------------------------------------------- ソース2 public class Test{ public static void main(String args[]){ String s1= "Hello"; String s2= "Good-Bye"; change(s1,s2); System.out.println(s1); } static void change(String s1,String s2){ s1 += ",Tom"; s1 = s2; } } 実行結果 Hello ------------------------------------------- 配列とString型は両方とも参照型なので ソース1の実行結果が「30」ならば、 ソース2の実行結果は「Good-Bye」になると思いました。 どなたか教えていただけないでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Java
  • javaの基本的な質問

    下記を実行すると、上から順番にメソッドが実行され、 「Hello Java  Hello Java」 と表示されるような気がしてしまうのですが… なぜ、一度しか表示されないのでしょうか。 class Main { public static void main(String[] args) { hello(); } public static void hello() { System.out.println("Hello Java"); } }

    • ベストアンサー
    • Java
  • javaの問題わからなくって質問します

    内容はEclipse上でプロジェクトフォルダを作りひとつは別のjavaファイルを動かすのともう一つはそのお同じフォルダから動かされるjavaプログラムです。 説明不足というかまだ触れてそんなにたってないのでソースを載せます class SampleManager { public static void main(String[] args){ exec obj= new exec(samlple1.java); obj.say(); } } class exec{ String phrase; exec(String phrase){ this.phrase=sample2.java; } void say(){ System.out.println(phrase); } } /////// public class samlple1 { public static String java; public static void exec(String[] args) {//execをした理由はSampleManagerにあるクラスexecを呼び出れるため System.out.println("Hello,World!")//この二つの出力結果を表示したい; System.out.println("こんにちは!"); } } ひとつのフォルダに上記のソースいれてSampleManager.java からsample.javaの出力結果の HelloWorld! こんにちは! を出力したいですがエラーはなく例外処理もありませんけど何故か出力結果はnullが返ってしまいます なぜでしょうか? アドバイスをお願いします

  • java 実行できない

    javaで public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } } のようなプログラムをかいて、コンパイルして、実行しようとすると エラー: メイン・メソッドがクラスStringで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args) またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要がありま というエラーがでます。コンパイルはできます。jdkは1.8.0_25を使っています。

  • 参照型変数の比較について

    1,2のソースについての質問となります。 ご教授の程お願い致します。 ◇◆1◆◇ class Sample{ public static void main(String args[]){ String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); System.out.println(s1 == "Hello"); //(1) } } ◇◆2◆◇ class Sample{ public static void main(String args[]){ String s1 = "Hello!Java"; String s2 = s1; s1 = s1.substring(6); //(2) System.out.println(s1); //(3) System.out.println(s2); //(4) } } ○1の質問 (1)の部分になりますが、 「s1 == "Hello"」の結果がtrueとなる理由が理解しずらいです。 「==」演算子では、「同じオブジェクトを参照しているか」を 比較するものであって、この場合「オブジェクトと文字列」の比較を しているので、falseになると思われます。 仮に、Helloがオブジェクトとして捉えられている場合であっても 「String s3 = new String("Hello");」で作成されたオブジェクトを 参照しているものとなるので、s1と比較をしてもfalseになると 思われます。 ○2の質問 このソースを実行後、 Java Hello!Java と、出力される理由についての質問となります。 (2)で「Java」の文字列を返し、s1に代入されますが、 s2はs1の参照型であるため、「Hello!Java」から「Java」に 変わると思われます。実際には、 Java Java と、出力されると思われます。 以上、わかりにくい箇所があると思われますが、 ご教授の程お願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう