package com.iotek.map;
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
Map<Student,String> map = new HashMap<Student,String>();
//<Student,String> 来限定map中存放的键为Student类型,值为String类型
map.put(new Student("jay",20), "张三"); //1
map.put(new Student("lisi",30), "李四");//2
map.put(new Student("rose",20), "玫瑰");//3
map.put(new Student("lisi",30), "陈飞");//4
System.out.println(map.size());
System.out.println(map);
/*
* Student类中不重写hashCode() and equals()方法,此处map.size()值是4,即map中有4个封装了键值对的Entry对象
* 重写了hashCode()和equals()方法后,2和4语句里的学生对象将被判断为同一个键名,因此2位置处的键值会被替换掉
* 这正是我们需要的,对象相同,应该判定为是同一个键,因此,这就是需要重写hashCode()和equals()方法的原因
*/
}
}
class Student {
private String name;
private int age;
@Override
/*
* 用source中的 Generate hashCode() and equals() 来
* 生成重写的hashCode()方法和equals()方法
* 只要姓名和年龄相同的学生,那么这个学生对象产生的hashCode值和equals方法的值也是一样的,
* 此时就可以认为是hashmap里放的是同一个对象,那么这两个相同的Student对象作为键时,
* 后面添加的Student对象对应的键值应该要覆盖掉前面添加的键值
* */
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; //只有当姓名和年龄都一样时,才返回一个true,表示是同一个对象
}
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;
}
}