public int hashCode() {
int i;
i = (name == null ? 0 : name.hashCode());
i = 10 * i + age;
return i;
}
*
* 3 HashSet移除 一个对象时,remove方法中的参数中为什么还要NEW一个对象?
package com.itheima;
import java.util.*;
class Person {
private String name;
private int age;
public Person(String n, int a) {
this.name = n; this.age = a;
}
/*public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
return (name.equals(p.name)) && (age == p.age);
}
return super.equals(obj);
}
public int hashCode() {
int i;
i = (name == null ? 0 : name.hashCode());
i = 10 * i + age;
return i;
}
*/
}
public class HashSetTest {
public static void main(String[] args) {
Collection c = new HashSet();
c.add(new Person("Jack", 20));
c.add(new Person("Jack", 20));
第二个问题:
通过上面也能看出来一点equals的作用,equals里面定义了如何判断两个Set集合元素是否相等。
具体的说由于Set集合里的元素是不重复的,那当加入一个新元素就需要那这个元素与集合里的其他元素作比较,如果集合中已存在要加入的元素,也就是符合自己定义的equals里的判断方式,那就不会添加这个元素,以保证集合里的成员唯一。
hashCode的作用也是保证Set集合里成员唯一,而且是先判断hashCode的值是否相等,如果相等在判断equals是否相等,如果都相等,那说明集合中已经存在相同成员了。至于为什么 要写成 i = 10 * i + age; 先要说说这句代码要做什么,就拿上面的1,2两个对象来说,i 就是那两个对象中jack对应的hash值,都是jack所以这两个是相同的,在加上age,都是20当然也相等了。但有一种特殊情况,假如有这样两个对象
new Person("Jack", 20));
new Person("Jahn",50));
这两个肯定不相等,但恰好jack对应的hash值是50,jahn的hash值是20。20+50=50+20,这样本来不应该相等的两个元素,却被判断为相等。所以年龄乘以随便一个数就可以避免这种情况发生。