使用封装类作为HashMap的键需要注意的问题
我们正常使用String类型作为健的时候比如:我们这里还是使用了泛型(在上一篇文章中提到过)
public static void main(String[] args) {
Map<String,String> m = new HashMap<String,String>();
//加入第一条数据
m.put("dalian", "大连市");
//加入第二条数据
m.put("fushun", "抚顺市");
//取得第一条数据、没有问题
String cityName = m.get("dalian");
}
但是使用封装类就没有这么直接了,举例如下:
//封装类Peron
public class Person() {
private int num;
private String name;
//构造方法
public Person(int num,String name) {
this.num = num;
this.name = name;
}
//省略getter、setter方法
}
测试方法:
public static void main(String[] args) {
Map<Person,String> m = new HashMap<Person,String>();
//加入第一条数据
m.put(new Person(1,"卡卡"), "球星");
//加入第二条数据
m.put(new Person(2,舒马赫), "F1车手");
//取得一条数据、取不到
String kind = m.get(new Person(1,"卡卡"));
}
解决办法:因为hashmap是通过hashcode来找到key的位置,然后通过equals来比较key内容是否相同,所以我们要重写hashCode方法和equals方法
//封装类Peron修改如下
public class Person() {
private int num;
private String name;
//构造方法
public Person(int num,String name) {
this.num = num;
this.name = name;
}
public int hashCode() {
return this.num;
}
public boolean equals(Object o) {
Person p = (Person)o;
if(this.num==p.getNum()&&this.name.equals(p.getName())) {
return true;
}
return false;
}
}
我们正常使用String类型作为健的时候比如:我们这里还是使用了泛型(在上一篇文章中提到过)
public static void main(String[] args) {
Map<String,String> m = new HashMap<String,String>();
//加入第一条数据
m.put("dalian", "大连市");
//加入第二条数据
m.put("fushun", "抚顺市");
//取得第一条数据、没有问题
String cityName = m.get("dalian");
}
但是使用封装类就没有这么直接了,举例如下:
//封装类Peron
public class Person() {
private int num;
private String name;
//构造方法
public Person(int num,String name) {
this.num = num;
this.name = name;
}
//省略getter、setter方法
}
测试方法:
public static void main(String[] args) {
Map<Person,String> m = new HashMap<Person,String>();
//加入第一条数据
m.put(new Person(1,"卡卡"), "球星");
//加入第二条数据
m.put(new Person(2,舒马赫), "F1车手");
//取得一条数据、取不到
String kind = m.get(new Person(1,"卡卡"));
}
解决办法:因为hashmap是通过hashcode来找到key的位置,然后通过equals来比较key内容是否相同,所以我们要重写hashCode方法和equals方法
//封装类Peron修改如下
public class Person() {
private int num;
private String name;
//构造方法
public Person(int num,String name) {
this.num = num;
this.name = name;
}
public int hashCode() {
return this.num;
}
public boolean equals(Object o) {
Person p = (Person)o;
if(this.num==p.getNum()&&this.name.equals(p.getName())) {
return true;
}
return false;
}
}