Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

equals()の等値と等価

下記のコードでremoveで削除できないのはequals()のオーバーライドをしていないからと書いてあるのですが、
equals()は等値判定をしているのでh1がnewされて新しいアドレスになったらListに入っているh1も新しい
アドレスのなるのではないでしょうか。
Listの入っているh1とnewした後のh1は違うということでしょうが、配列に入ったクラス型は変化しないという
理解でいいでしょうか?
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {        
        List<Hero> list=new ArrayList<>();
        
        Hero h1=new Hero();
        h1.name="ミナト";
        list.add(h1);
        System.out.println(list.size());
        h1=new Hero();
        h1.name="ミナト";
        list.remove(h1);    
        System.out.println(list.size());
    }

}
public class Hero {
    public  String name;        
}

10

回答

304

閲覧

10件の回答

評価

0

>Listの入っているh1とnewした後のh1は違う
簡単に言えば、Listはアドレスを格納するんだよ。

評価

0

回答、ありがとうございました。
Listにアドレスが入っているのはわかっていたのですが、list(h1)はどういう存在なのかがわかりませんでした。
クラス変数としては直接アクセスできないということですね。
ぼんやりと理解しました。

評価

0

list(h1)がどこのことを言ってるのか分からないが。

最初のnewで得られるアドレスが100、次のnewで得られるアドレスが200だとして、
addしているのは100というアドレスであり、Listはこれしか持たない(h1という変数はmain()の中だけのものだ)。
h1がnewして200になったところで、Listの中は100のままだ。
removeも同様にh1という変数ではなく200というアドレスがListに渡る。
Listとしてはそんなアドレスは格納してない、と言うことになる。

removeしたいのであれば、100のアドレスと200のアドレスが同じものだという情報を、Listが分かるようにしてやる必要がある。
それがequals()メソッドのオーバーライドということ。

評価

0

丁寧な説明をありがとうございます。
equals()メソッドを参考書を見ながら作ったらうまく削除できました。
public boolean equals(Object o) {
    if (o == this) return true;
      if (o == null) return false;
      if(!(o instanceof Hero)) return false;
      Hero h2 = (Hero)o;
      if (!this.name.equals(h2.name)) {
        return false;
      }
      return true;
  }
いろいろな疑問があってもだれにも聞くことができないのでたいへん助かります。
今後もよろしくお願いします。

評価

0

そのequals()メソッドがあるとなんでうまく行くのかまで理解できれば、このステップは完了だと思う。
基礎の部分を「何となく」で終わらせないことが、上達には不可欠だよ。

評価

0

たいへん助かりました。
感謝します。

評価

0

555

評価

0

555

評価

0

555

評価

0

555

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名