A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王德云 金牌黑马   /  2011-11-14 19:30  /  2010 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问以下代码返回的结果是什么?为什么?
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 坐等回答。

查看全部评分

3 个回复

倒序浏览
本帖最后由 郭学文 于 2011-11-14 19:50 编辑

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

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

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

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

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

让Equalse去干活

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
应该是返回null的。hashmap索引根据hashcode查找。如果不实现hashcode方法,那么存于key中的则是Object的hashcode方法返回的地址。
两个新的实例地址自然不会相同。
楼主还实现了一下toString方法,这个很气人。
除非
hm.put(new Person("张三", 20).toString(), "张三");
System.out.println(hm.get(new Person("张三", 20).toString()));
这样才行。

评分

参与人数 2技术分 +1 黑马币 +20 收起 理由
宁超 + 1
郭学文 + 20 赞一个!

查看全部评分

回复 使用道具 举报
答案是null
因为你没有覆盖对象的hashCode()和equals()方法,
你要在Person类里面加入这两个方法,这两个方法在工具里可以自动生成,
你在Person类里面右击选择—>source—>Generate hashCode()  and equals()
选择Person对象在存放时应该按照那个基本属性进行存储,
你可以选择name

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
宁超 + 1
wqvbqjgwhvbw + 10 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马