因为如果 List 里面装的是对象,一定要重写 equals 和 hashcode 方法(都是 Object 类下面的方法); 不然比较的是堆内存地址,那么本文也就毫无意义了。
/**
* 对象类型的处理
*/
public static void test1() {
List<Student> list1 = new ArrayList<>();
list1.add(new Student("思乡渔夫","F0002"));
list1.add(new Student("阿胖山","F0001"));
list1.add(new Student("牛叔","N1003"));
List<Student> list2 = new ArrayList<>();
list2.add(new Student("牛叔","N1003"));
list2.add(new Student("玉田","N1004"));
// 交集
List<Student> intersection = list1.stream().filter(list2::contains).collect(Collectors.toList());
System.out.println("---交集---"+intersection);
// 差集 (list1 - list2)
List<Student> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
System.out.println("---差集 (list1 - list2)---"+reduce1);
// 差集 (list2 - list1)
List<Student> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(Collectors.toList());
System.out.println("---差集 (list2 - list1)---"+reduce2);
// 并集
CollectionUtils.addAll(list1,list2);
System.out.println("---并集 list---"+list1);
// 去重并集,方法有很多这里只列举一种
HashSet<Student> hashSet = new HashSet<>(list1);
System.out.println("---去重并集 list---"+hashSet);
}
重写hashcode 与 equals方法
1.equals方法
主要用来判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,且区分大小写。
而自定义的对象,需要重写equals()方法,来判断两个对象是否在属性和内容上“相等”。
2.hashCode方法
hashCode()方法将对象在内存中的地址作为哈希码返回,可以保证不同对象的返回值不同。
与equals()方法类似,hashCode()方法可以被重写。
3.重写 equals与hashcode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
age == user.age &&
Objects.equals(name, user.name) &&
Objects.equals(gender, user.gender) &&
Objects.equals(birthday, user.birthday);
}
public int hashCode() {
return Objects.hash(id, name, gender, age, birthday);
}
同时重写的原因:
在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。