正确使用Map必须保证:
- 作为Key的对象必须正确覆写equals()方法
- 作为Key的对象必须正确覆写hashCode()方法
覆写hashCode:
- 如果两个对象相等,则两个对象的hashCode()必须相等
- 如果两个对象不相等,则两个对象的hashCode()尽量不相等(可以相等,会造成效率下降)
- hashCode可以通过Objects.hashCode()辅助方法实现
1. 先创建一个Person对象,该Person对象没有实现equals()方法和hashCode()方法
import java.util.Objects;
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "(Person: " + name + ", " + age + ")";
}
}
此时如果使用Map.get()
方法取数据,则返回null
package util.map;
import util.toolclass.Person;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UseMap {
public static void main(String[] args) {
List<Person> p = Arrays.asList(new Person("Mike", 18), new Person("Jane", 17), new Person("Ehang", 18));
Map<Person, String> map = new HashMap<>();
for (Person person : p) {
map.put(person, person.getName());
}
System.out.println(map.get(new Person("Mike", 18)));
}
}
运行结果:
在Person类中添加equals和hashCode()方法后,运行结果变为Mike。
package util.toolclass;
import java.util.Objects;
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Person) {
Person p = (Person) obj;
return Objects.equals(this.name, p.name) && this.age == p.age;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(this.name, this.age);
}
@Override
public String toString() {
return "(Person: " + name + ", " + age + ")";
}
}
运行结果:
因此在使用Map时,作为key的对象一定要正确的实现equals()方法和hashCode()方法。