Java集合:equals与hashCode重写问题

分别执行:

  1. 没有重写equals也没有重写hashCode

aa行:输出false

  1. 重写equals没有重写hashCode

aa行:输出true;
此时借助Set来观察是否有区别:属性值相同的两个对象hashCode不相等,导致Set中出现重复存储

  1. 重写equals也重写hashCode

aa行:输出true;
此时Set中只有一个[Student: id = 1, name = 张三]

import java.util.HashSet;
import java.util.Iterator;

// 为什么重写equals要重写hashCode?
public class Why {
	public static void main(String[] args) {
		Student s1 = new Student(001, "张三");
		Student s2 = new Student(001, "张三");
	
		System.out.println(s1.equals(s2));  // aa
		System.out.println("------");
		
		HashSet<Student> students = new HashSet<>();
		students.add(s1);
		students.add(s2);
		
		Iterator iterator = students.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next().toString());
		}
		System.out.println("------");
	}

}

class Student {
	private int id;
	private String name;
	public Student(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	
	// 基于id来判断两个对象是否相同
	
	@Override
	public boolean equals(Object obj) {
		return obj.equals(id);
	}
	
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return id;
	}
	
	@Override
	public String toString() {
		return "[Student: id = " + id + ", name = " + name + "]";
	}
	
}
posted @ 2021-09-23 15:01  aguo718  阅读(65)  评论(0)    收藏  举报