一、hashCode()
1. 默认情况下所有的对象的父类是Object,因为对象都可以调用Object类的hashCode()方法
2. hashCode() ,用于计算对象在内存中的地址(可能并不是实际的物理地址)
二、== 运算符 与 equals() 方法
首先,区分两种情况:
1. 若比较的是两个字符串变量: 则==比较的是对象在字符串中的首地址,equals()则比较的是字符串的内容。
public class Test {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2 ); // false; 比较的是在内存中的首地址
System.out.println(s1.equals(s2)); // true; 比较的是实际的内容
}
}
2. 若往Collection集合类中添加对象时,需要比较两个对象是否重复
判断是否重复的流程:
1. 两个对象的hashCode()返回值是否相同,若相同进行第二步操作
2. 调用equals()方法,比较内容是否相同。
所以会出现两个对象的hashCode()相同但是内容不同的情况
解决办法:重写对象的hashCode()方法和equals()方法
public class employee { // 自定义employee类
private String name;
private int age;
public employee() {
}
@Override // 覆盖重写equals方法
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
employee employee = (employee) o;
return age == employee.age &&
Objects.equals(name, employee.name);
}
@Override // 覆盖重写hashCode方法
public int hashCode() {
return Objects.hash(name, age);
}
public employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在HashSet类中验证重复的判断流程
public class Test {
public static void main(String[] args) {
HashSet<Employee> human = new HashSet<>();
Employee s1 = new Employee("xiaoming", 12);
Employee s2 = new Employee("xiaoming", 12);
System.out.println(s1.hashCode()); // -364430695
System.out.println(s2.hashCode()); // -364430695
human.add(s1);
human.add(s2);
System.out.println(human); // [Employee{name='xiaoming', age=12}]
/* 第二次添加的s2对象,与s1对象的hashCode相同;接着调用equals()方法也返回true,
* 因此判断为重复对象,HastSet中只有一个对象。
* */
}
}
3. 在其他一般情况下:
== 和 equals() 方法比较的都是在内存中的地址