看下面的代码:
public class test {
public static void main(String agrc[]){
List<String> a = new ArrayList<String>();
List<String> b = new ArrayList<String>();
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<Student> s1 = new ArrayList<Student>();
List<Student> s2 = new ArrayList<Student>();
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方法时,会先对集合元素进行比较,如果元素相等才执行移除操作,说到这,相信很多人都已经明白是怎么回事了,因为不相等(equals),所以没有执行移除。
为什么会出现不相等的情况,实体类属性明明相同,为什么会不相等?
因为实体类没有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<Student> s1 = new ArrayList<Student>();
List<Student> s2 = new ArrayList<Student>();
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了