关于你提到的代码
if (obj == null)
{
result = false;
}
这个条件要求被比较的对象不能为空,即被比较的对象必须被初始化
if (this == obj)
{
result = true;
}
这个条件是说如果被比较的对象在内存中的地址与比较对象相同则认为相等,显然嘛,内存地址相等就等于说是同一个对象
if (obj instanceof Student)
{
Student stu = (Student) obj;
if (stu.getName().equals(this.name) && stu.getAge() == (this.age))
{
result = true;
}
}
这个条件就是说被比较的对象非空且内存地址也不等的时候,即两个不同的实例,则比较实例的属性,如果属性相等则也认为是同一个对象。
至于你问的覆写hashCode()方法,我的理解是这样的:
Object的原始的hashCode()方法中是将对象的内存地址值作为实例的哈希值,因此在使用Set的时候就一定要覆写hashCode()方法
原因是Set在add一个新对象的时候并不是将这个新对象与Set内的对象逐一通过equals()进行比较,而是比较新对象与Set内的对象的哈希值以区分新对象是否重复,因为Set中不允许存在重复元素嘛。用你程序中的例子比如我new了两个Student类的新对象
Student s1 = new Student("zhangsan",21);
Student s2 = new Student("zhangsan",21);
你先将s1添加入一个Set,之后添加s2,此时你肯定希望s2无法被添加,因为s2和s1是同一个人
如果你不覆写Student类的hashCode()方法,那么此时s2是可以被添加的,因为s2与s1的内存地址不同
那么,如果你覆写了hashCode(),并且在方法中使用学生的姓名和年龄来生成一个哈希值,那么这个时候s2就可以顺利的无法被添加,因为你通过覆写后的hashCode()给与了姓名和年龄都相同的两个不同实例相同的哈希值 |