質問編集履歴

2 訂正

sakuman0

sakuman0 score 15

2016/10/13 00:29  投稿

[==]と[equals]の挙動の違いを確認したい。
###前提・実現したいこと
[==]と[equals]の挙動の違いを確認したい。
###発生している問題・エラーメッセージ
意図した動作にならない。
###該当のソースコード
public class Main {
 public static void main(String[] args){
   Hero h1 = new Hero();
   h1.name = "ミナト";
   h1.hp = 100;
   Hero h2 = new Hero();
   h2.name = "ミナト";
   h2.hp = 100;
   if(h1.equals(h2) == true){
     System.out.println("同じ内容です");
   }else{
     System.out.println("違う内容です");
   }
   if(h1 == h2){
     System.out.println("同じ内容です");
   }else{
     System.out.println("違う内容です");
//以下Heroクラス
public class Hero {
 String name;
 int hp;
 }
【出力結果】
違う内容です
違う内容です
###補足情報(言語/FW/ツール等のバージョンなど)
ネットなどで確認する限りだと、
「==」はクラスに代入された値が同じであればtrueを表示。
「epuals」はメモリ上の保存位置まで同じであればtrueを表示。
と書いてあるように認識しました。
2つのインスタンスを使っているので、下がfalseになるのは分かるのですが、
全く同じ内容の上がfalseになるのはなぜでしょうか。
初歩的な内容で恐れ入りますが、ご教示頂けますでしょうか。
【追加質問】
ご回答有難う御座いました!
色々理解がずれていたようなので、諸々再確認したのですが、
以下のような理解であってますでしょうか。
【解釈】
まず、オブジェクトはインスタンスの属性が代入された状態だと認識してます
※<http://nobuo-create.net/java-beginner-17/> 参照
APIのequals説明を見ると、比較対象が同じオブジェクトを参照する場合に
trueを表示と記載されていました。
今回は「==」「equals」両方ともfalseと表示されたのですが、
=========
・if(h1.equals(h2) == true){
=========
上記は、オブジェクトを「属性が代入されているインスタンス」だと理解すれば、
h1とh2はメモリ上の別々の場所に保存されており、「違うインスタンス」となるので、
代入後に「違うオブジェクト」となり、falseになると解釈しています。
=========
・if(h1 == h2){
=========
こちらについてですが、「==」は内容さえ同じであればtrueのはずがfalseになるのが気になります。
資料を模索して、以下のような解釈に至ったのですが、あってますでしょうか。
・「==」は変数に代入されている値にのみ有効。 newすると使えない。
・ オブジェクトを比較したいなら、「equals」を使うしかない。
 但し、代入された値が同じというだけだとfalseになる。
 
http://javatechnology.net/java/if_string_equals/
※ちなみに上記の資料を参照して解釈しました。
  • Java

    20026 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1 <認識確認>

sakuman0

sakuman0 score 15

2016/10/13 00:26  投稿

[==]と[equals]の挙動の違いを確認したい。
###前提・実現したいこと
[==]と[equals]の挙動の違いを確認したい。
###発生している問題・エラーメッセージ
意図した動作にならない。
###該当のソースコード
public class Main {
 public static void main(String[] args){
   Hero h1 = new Hero();
   h1.name = "ミナト";
   h1.hp = 100;
   Hero h2 = new Hero();
   h2.name = "ミナト";
   h2.hp = 100;
   if(h1.equals(h2) == true){
     System.out.println("同じ内容です");
   }else{
     System.out.println("違う内容です");
   }
   if(h1 == h2){
     System.out.println("同じ内容です");
   }else{
     System.out.println("違う内容です");
//以下Heroクラス
public class Hero {
 String name;
 int hp;
 }
【出力結果】
違う内容です
違う内容です
###補足情報(言語/FW/ツール等のバージョンなど)
ネットなどで確認する限りだと、
「==」はクラスに代入された値が同じであればtrueを表示。
「epuals」はメモリ上の保存位置まで同じであればtrueを表示。
と書いてあるように認識しました。
2つのインスタンスを使っているので、下がfalseになるのは分かるのですが、
全く同じ内容の上がfalseになるのはなぜでしょうか。
初歩的な内容で恐れ入りますが、ご教示頂けますでしょうか。
初歩的な内容で恐れ入りますが、ご教示頂けますでしょうか。
【追加質問】
ご回答有難う御座いました!
色々理解がずれていたようなので、諸々再確認したのですが、
以下のような理解であってますでしょうか。
【解釈】
まず、オブジェクトはインスタンスの属性が代入された状態だと認識してます
※<http://nobuo-create.net/java-beginner-17/> 参照
APIのequals説明を見ると、比較対象が同じオブジェクトを参照する場合に
trueを表示と記載されていました。
今回は「==」「equals」両方ともfalseと表示されたのですが、
=========
・if(h1.equals(h2) == true){
=========
上記は、オブジェクトを「属性が代入されているインスタンス」だと理解すれば、
h1とh2はメモリ上の別々の場所に保存されており、「違うインスタンス」となるので、
代入後に「違うオブジェクト」となり、falseになると解釈しています。
=========
・if(h1 == h2){
=========
こちらについてですが、「==」は内容さえ同じであればtrueのはずがfalseになるのが気になります。
資料を模索して、以下のような解釈に至ったのですが、あってますでしょうか。
・「==」は変数に代入されている値にのみ有効。 newすると使えない。
・ オブジェクトを比較したいなら、「equals」を使うしかない。
  但し、代入された値が同じというだけだとfalseになる。
  
http://javatechnology.net/java/if_string_equals/
※ちなみに上記の資料を参照して解釈しました。
  • Java

    20026 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る