黑马程序员技术交流社区

标题: 关于Map使用自定义类做为 key时的问题 [打印本页]

作者: Oo不弃    时间: 2015-2-10 21:14
标题: 关于Map使用自定义类做为 key时的问题
本帖最后由 Oo不弃 于 2015-2-11 18:42 编辑

先看代码:
  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import com.wgh.model.Goods;
  4. class Student{
  5.         private String name;
  6.         private int age;
  7.         
  8.         public Student(){
  9.         }
  10.         
  11.         public Student(String name,int age){
  12.                 this.age = age;
  13.                 this.name = name;
  14.         }
  15. }
  16. public class Test {

  17.         public static void main(String[] args) {
  18.                
  19.                 Map<Student,String> map = new HashMap<Student,String>();
  20.                 Student stu1 = new Student("张三",20);
  21.                 Student stu = new Student("张三",20);
  22.                 Student stu2 = new Student("李四",22);
  23.                 Student stu3 = new Student("王五",23);
  24.                
  25.                
  26.                 map.put(stu1,"学生张三");
  27.                 map.put(stu2,"学生李四");
  28.                 map.put(stu3,"学生王五");
  29.                
  30.                 String s = map.get(stu);
  31.                 System.out.print(s);
  32.                
  33.         }

  34. }
复制代码

上面代码输出结果是null,其实我是想输出”学生张三“。上面map的key可以设置为student类型,但是也产生一个问题,就是在执行get操作的时候,相同的内容,不同的对象,get出来的结果是不一样的。上面的stu和stu1虽然是不同对象,但是内容是一样的,如果我想在map.get(stu)的时候也输出”学生张三“(在没有把stu put进map里面的前提下),大神们可有什么办法不?





作者: 马铃薯    时间: 2015-2-10 21:34
你在好好看看你的代码哦!     String s = map.get(stu);  这里你键反回的值就是NULL,  因为你上面就没有在键中关联值!   希望对你有帮助!
作者: Oo不弃    时间: 2015-2-10 23:44
马铃薯 发表于 2015-2-10 21:34
你在好好看看你的代码哦!     String s = map.get(stu);  这里你键反回的值就是NULL,  因为你上面就没有 ...

恩恩,我知道为什么输出null,我就不知道有什么办法可以在map.get(stu)的时候也输出”学生张三“(在没有把stu put进map里面的前提下)
作者: 奔跑的猴子    时间: 2015-2-10 23:52
Oo不弃 发表于 2015-2-10 23:44
恩恩,我知道为什么输出null,我就不知道有什么办法可以在map.get(stu)的时候也输出”学生张三“(在没 ...

理论上应该不可行,因为stu跟map之间没有任何关系啊
作者: 白衣布士    时间: 2015-2-11 00:24
Oo不弃 发表于 2015-2-10 23:44
恩恩,我知道为什么输出null,我就不知道有什么办法可以在map.get(stu)的时候也输出”学生张三“(在没 ...

没添加怎么能行,除非你使用stu1
作者: 瞿乐    时间: 2015-2-11 12:13
stu 是你new了一个对象,每次使用new 关键字,就是在内存中开辟新的内存。stu和你之前new的stu1 肯定不是相同的地址引用,所以不是同一个对象,就不会获取成功了。
作者: hhqnmlgb    时间: 2015-2-11 13:06
本帖最后由 hhqnmlgb 于 2015-2-11 13:19 编辑

判断对象是否相同的条件有两个,
1,看hashCode值是否相同
2,看equals是否相同
所以只要覆盖Student的hashCode方法和equals方法就可以了                        
        public int hashCode()
        {
                return name.hashCode()+age*17;
        }
        public boolean equals(Object o)
        {
                if(!(o instanceof Student))
                        throw new ClassCastException("不是Student");
                Student stu=(Student)o;
                return this.name.equals(p.name)&&this.age==p.age;
        }





作者: Oo不弃    时间: 2015-2-11 18:30
hhqnmlgb 发表于 2015-2-11 13:06
判断对象是否相同的条件有两个,
1,看hashCode值是否相同
2,看equals是否相同

牛!感谢这位哥们,问题解决了,{:3_64:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2