黑马程序员技术交流社区

标题: hashCode()方法的使用 [打印本页]

作者: 王德云    时间: 2011-11-14 19:30
标题: hashCode()方法的使用
请问以下代码返回的结果是什么?为什么?
  1. package com.lesson13;

  2. import java.util.HashMap;

  3. public class HashCodeDemo {
  4.         public static void main(String[] args) {
  5.                 HashMap hm = new HashMap();

  6.                 hm.put(new Person("张三", 20), "张三");
  7.                 System.out.println(hm.get(new Person("张三", 20)));
  8.         }
  9. }

  10. class Person {
  11.         private String name;
  12.         private int age;

  13.         Person(String name, int age) {
  14.                 this.name = name;
  15.                 this.age = age;
  16.         }

  17.         @Override
  18.         public String toString() {
  19.                 return "姓名:" + this.name + "年龄:" + this.age;
  20.         }
  21. }
复制代码

作者: 郭学文    时间: 2011-11-14 19:40
本帖最后由 郭学文 于 2011-11-14 19:50 编辑

Person p=new Person("张三", 20);

hm.put(p, "张三");

System.out.println(hm.get(p));

你New了两次,已经不是一个对象了

你可覆写一个HashCode 就直接Return 1

让Equalse去干活
作者: 梦女孩    时间: 2011-11-14 19:43
应该是返回null的。hashmap索引根据hashcode查找。如果不实现hashcode方法,那么存于key中的则是Object的hashcode方法返回的地址。
两个新的实例地址自然不会相同。
楼主还实现了一下toString方法,这个很气人。
除非
hm.put(new Person("张三", 20).toString(), "张三");
System.out.println(hm.get(new Person("张三", 20).toString()));
这样才行。


作者: zhanghua    时间: 2011-11-14 19:43
答案是null
因为你没有覆盖对象的hashCode()和equals()方法,
你要在Person类里面加入这两个方法,这两个方法在工具里可以自动生成,
你在Person类里面右击选择—>source—>Generate hashCode()  and equals()
选择Person对象在存放时应该按照那个基本属性进行存储,
你可以选择name




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