Student 类:
package com.demo.main;
public class Student {
private String name ;
private int age ;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
Main类:
package com.demo.main;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<Student,String> map = new HashMap<>() ;
map.put(new Student("张三",13),"北京");
map.put(new Student("张三",13),"上海");
map.put(new Student("李四",14),"深圳");
map.put(new Student("王五",15),"广州");
map.put(new Student("赵六",16),"济宁");
//重写HashCode和equals方法之前:
//System.out.println(map);输出了Student [name=张三, age=13]=上海, Student [name=张三, age=13]=北京,因为前面的Student对象一样,但是hashcode默认算出的是不一样的,所以后面的没有将前面相同的覆盖掉。
//比较 自定义类的对象是否相等,需要重写HashCode和equals两个方法,这一点和HashSet集合相似,hashcode相同再调用equals方法。
//重写HashCode和equals方法之后:
System.out.println(map);//只剩下Student [name=张三, age=13]=上海,上海的张三把北京的张三覆盖了。
//为什么输出的结果格式为:Student [name=张三, age=13]=上海 Student[name=,age=]= 这样的。
/*
* 分析:
* 在HashMap中 Ctrl+o 搜索 toString()方法,
* 在Entry中有一个toString,但是Entry是HashMap类的内部类,
* 内部类中的方法,不能被HashMap直接调用,
* 所以去HashMap的父类中找一下是否继承了父类的toString()方法。
*
* HashMap extends AbstractMap implements Map
* HashMap的父类为AbstractMap。
* 在AbstractMap中ctrl+o 搜索toString()方法:找到了。
* 所以HashMap类继承了AbstractMap类中的toString()方法。
*
*/
}
}