removeAllメソッドの使用に関する質問

2889 ワード

次のコードを見てください.
public class test {
	public static void main(String agrc[]){
		List a = new ArrayList();
		List b = new ArrayList();
		a.add("1");
		a.add("2");
		a.add("3");
		a.add("4");
		b.add("1");
		b.add("3");
		a.removeAll(b);
		System.out.println(a);
		
	}
}

 印刷結果は2,4
 
次のコードを見てください.
import java.util.ArrayList;
import java.util.List;

public class test {
	public static void main(String agrc[]){	
		
		List s1 = new ArrayList();
        List s2 = new ArrayList();
        s1.add(new Student("  "));
        s1.add(new Student("  "));
        s1.add(new Student("  "));
        s1.add(new Student("  "));
        s2.add(new Student("  "));
        s2.add(new Student("  "));
        s1.removeAll(s2);
        System.out.println(s1.size());
	}
}


class Student{
    String name;
    
    /**
     * @param string
     */
    public Student(String name) {
        this.name = name;
    }
}

 印刷結果は4ですが、なぜremoveAllが無効になったのでしょうか?
どうしてこんなことになったの?もしかしてremoveAllの方法に問題があるのでしょうか?
 
removeAllメソッドを実行するときは、まず集合要素を比較し、要素が等しい場合に除去操作を実行するので、これといえば、何が起こっているのかよく知っている人が多いと思いますが、等しくないので除去は実行されません.
 
なぜ等しくない場合が発生し、エンティティクラスの属性が同じであるのに、なぜ等しくないのですか?
 
エンティティクラスにはOverride hashCodeとequalsメソッドがないからです!removeAllメソッドを実行する場合はequalsメソッドで集合要素が等しいかどうかを判断し、Override equalsメソッドがない場合はデフォルトで比較対象となるため、上記の問題が発生します!
 
結局、やはり基礎がしっかりしていないのか、同時に自分にも目を覚まして、実体クラスを書くときはできるだけOverride hashCodeとequalsの方法を書いて、いつ問題が発生するか分からない.
 
次はEQUALSを書き換えた結果です.
import java.util.ArrayList;
import java.util.List;

public class test {
	public static void main(String agrc[]){	
		
		List s1 = new ArrayList();
        List s2 = new ArrayList();
        s1.add(new Student("  "));
        s1.add(new Student("  "));
        s1.add(new Student("  "));
        s1.add(new Student("  "));
        s2.add(new Student("  "));
        s2.add(new Student("  "));
        s1.removeAll(s2);
        System.out.println(s1.size());
	}
}


class Student{
    String name;
    
    /**
     * @param string
     */
    public Student(String name) {
        this.name = name;
    }

    public boolean equals( Object obj){
        if (obj == null) return false ;
        if (this == obj) {
            return true;
        }
        if (obj instanceof Student){
            Student s = (Student) obj;
            if(this.name.equals(s.name)){
                return true;
            }
        }
        return false;
    }
    
}

 結果は2です