关于Map使用自定义类做为 key时的问题
先看代码:importjava.util.HashMap;importjava.util.Map;classStudent{privateStringname;priva...
先看代码:
import java.util.HashMap;
import java.util.Map;
class Student{
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.age = age;
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
Map<Student,String> map = new HashMap<Student,String>();
Student stu1 = new Student("张三",20);
Student stu = new Student("张三",20);
Student stu2 = new Student("李四",22);
Student stu3 = new Student("王五",23);
map.put(stu1,"学生张三");
map.put(stu2,"学生李四");
map.put(stu3,"学生王五");
String s = map.get(stu);
System.out.print(s);
}
}
上面代码输出结果是null,其实我是想输出”学生张三“。上面map的key可以设置为student类型,但是也产生一个问题,就是在执行get操作的时候,相同的内容,不同的对象,get出来的结果是不一样的。上面的stu和stu1虽然是不同对象,但是内容是一样的,如果我想在map.get(stu)的时候也输出”学生张三“(在没有把stu put进map里面的前提下),大神们可有什么办法不? 展开
import java.util.HashMap;
import java.util.Map;
class Student{
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.age = age;
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
Map<Student,String> map = new HashMap<Student,String>();
Student stu1 = new Student("张三",20);
Student stu = new Student("张三",20);
Student stu2 = new Student("李四",22);
Student stu3 = new Student("王五",23);
map.put(stu1,"学生张三");
map.put(stu2,"学生李四");
map.put(stu3,"学生王五");
String s = map.get(stu);
System.out.print(s);
}
}
上面代码输出结果是null,其实我是想输出”学生张三“。上面map的key可以设置为student类型,但是也产生一个问题,就是在执行get操作的时候,相同的内容,不同的对象,get出来的结果是不一样的。上面的stu和stu1虽然是不同对象,但是内容是一样的,如果我想在map.get(stu)的时候也输出”学生张三“(在没有把stu put进map里面的前提下),大神们可有什么办法不? 展开
1个回答
展开全部
这个需要重写Student类的hashCode和equals方法。这两个方法是集成自超类Object的。
HashMap默认是使用hashCode对比传入的key是否一致,如果hashCode一致会用equals进行对比,如果还是一致那么认为是同一个key。
你的Student类有age和name两个成员变量,可以根据这两个变量设定hashCode和equals方法。
public int hashCode(){
return name.hashCode() + age;
}
public boolean equals(Object o){
return (o instanceof Student) &&
(age ==((Student)o).age) &&
(name == null && ((Student)o).name == null ||
name.equals(((Student)o).name)
);
}
HashMap默认是使用hashCode对比传入的key是否一致,如果hashCode一致会用equals进行对比,如果还是一致那么认为是同一个key。
你的Student类有age和name两个成员变量,可以根据这两个变量设定hashCode和equals方法。
public int hashCode(){
return name.hashCode() + age;
}
public boolean equals(Object o){
return (o instanceof Student) &&
(age ==((Student)o).age) &&
(name == null && ((Student)o).name == null ||
name.equals(((Student)o).name)
);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询