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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马上都有 中级黑马   /  2014-4-16 12:41  /  1156 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//下面的程序中主方法当中的最后两句为什么打印false??
import java.util.*;
import java.io.*;

public class Test{
public static void main(String[]args)throws Exception{
HashMap hm = new HashMap();
hm.put(new StudentKey("200601","200601"),new StudentValue("张三丰","男","计算机","软件工程","20"));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("studentData"));
oos.writeObject(hm);
FileInputStream fis = new FileInputStream("StudentData");
ObjectInputStream ois = new ObjectInputStream(fis);
hm = (HashMap)ois.readObject();
System.out.println(hm);
Set set = hm.keySet();
System.out.println(set);

StudentKey sk = new StudentKey("200601","200601");
StudentKey sk1 = new StudentKey("200601","200601");
//下面为什么打印false????
System.out.println(set.contains(sk));
System.out.println(hm.containsKey(sk));
}

}
class StudentKey implements Serializable{
Strin

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 曹冬明 于 2014-4-16 13:50 编辑

先说第一句:keySet方法返回的是键Set集合的视图,里面存的都是地址,你后面两句连续new两个对象,在堆内存中开辟了两个空间,地址都不同,而你之前new哪个和这两个更不同了,3个地址都不相同,你认为结果会返回true么。第二个和上面的道理是一样的

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 呆呆沙师妹 于 2014-4-16 14:31 编辑

你在程序中将set中元素取出,调用equals方法与sk进行比较,如果结果为false;
请检查,StudentKey重写equals方法,比对的成员变量中有没有采用了transient修饰符非静态变量,
被transient修饰的变量则不会被保存。从而导致equals结果为false。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
曹冬明 发表于 2014-4-16 13:26
先说第一句:keySet方法返回的是键Set集合的视图,里面存的都是地址,你后面两句连续new两个对象,在堆内存 ...


你说的不对,contain方法中判断是否包含对象,又不是默认用“==”方法来比较地址,API文档中指出:当且仅当 set 包含满足 (o==null ? e==null : o.equals(e)) 的元素 e 时返回 true。 也就是说set调用对象本身的equals方法来比较是否相等的。
HashMap集合中的containsKey方法也是,不过为了提高哈希表的性能,在进行equals比较前,得先比较两对象的哈希值。
回复 使用道具 举报
呆呆沙师妹 发表于 2014-4-16 14:03
你说的不对,contain方法中判断是否包含对象,又不是默认用“==”方法来比较地址,API文档中指出:当且仅 ...

如果他的Student类中没有复写equals方法,比的就是地址值啊,有问题么
回复 使用道具 举报
曹冬明 发表于 2014-4-16 14:15
如果他的Student类中没有复写equals方法,比的就是地址值啊,有问题么

好吧。虽然只是假定,但这也可能是问题原因,是我对把问题没考虑全面,抱歉。
回复 使用道具 举报
呆呆沙师妹 发表于 2014-4-16 14:22
好吧。虽然只是假定,但这也可能是问题原因,是我对把问题没考虑全面,抱歉。 ...

可别这么说,我也没考虑全面,应该把你说的和我说的结合到一起,如果没有覆盖equals比较的是地址,如果覆盖了就是你的说的那些了,技术讨论没什么抱歉不抱歉的,谁都不一定对
回复 使用道具 举报
曹冬明 发表于 2014-4-16 14:26
可别这么说,我也没考虑全面,应该把你说的和我说的结合到一起,如果没有覆盖equals比较的是地址,如果覆 ...

嗯,你说得的对。哈哈,光这个讨论,就把这帖子给顶起来了。
回复 使用道具 举报
1  set.contains(sk)  //你没有把  sk对象 通过put 添加到map里。KeySet必然不包含sk对象。你只是把匿名的对象添加到map 里 。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马