黑马程序员技术交流社区

标题: 集合和IO [打印本页]

作者: 马上都有    时间: 2014-4-16 12:41
标题: 集合和IO
//下面的程序中主方法当中的最后两句为什么打印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

作者: 曹冬明    时间: 2014-4-16 13:26
本帖最后由 曹冬明 于 2014-4-16 13:50 编辑

先说第一句:keySet方法返回的是键Set集合的视图,里面存的都是地址,你后面两句连续new两个对象,在堆内存中开辟了两个空间,地址都不同,而你之前new哪个和这两个更不同了,3个地址都不相同,你认为结果会返回true么。第二个和上面的道理是一样的
作者: 呆呆沙师妹    时间: 2014-4-16 13:51
本帖最后由 呆呆沙师妹 于 2014-4-16 14:31 编辑

你在程序中将set中元素取出,调用equals方法与sk进行比较,如果结果为false;
请检查,StudentKey重写equals方法,比对的成员变量中有没有采用了transient修饰符非静态变量,
被transient修饰的变量则不会被保存。从而导致equals结果为false。
作者: 呆呆沙师妹    时间: 2014-4-16 14:03
曹冬明 发表于 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:15
呆呆沙师妹 发表于 2014-4-16 14:03
你说的不对,contain方法中判断是否包含对象,又不是默认用“==”方法来比较地址,API文档中指出:当且仅 ...

如果他的Student类中没有复写equals方法,比的就是地址值啊,有问题么
作者: 呆呆沙师妹    时间: 2014-4-16 14:22
曹冬明 发表于 2014-4-16 14:15
如果他的Student类中没有复写equals方法,比的就是地址值啊,有问题么

好吧。虽然只是假定,但这也可能是问题原因,是我对把问题没考虑全面,抱歉。
作者: 曹冬明    时间: 2014-4-16 14:26
呆呆沙师妹 发表于 2014-4-16 14:22
好吧。虽然只是假定,但这也可能是问题原因,是我对把问题没考虑全面,抱歉。 ...

可别这么说,我也没考虑全面,应该把你说的和我说的结合到一起,如果没有覆盖equals比较的是地址,如果覆盖了就是你的说的那些了,技术讨论没什么抱歉不抱歉的,谁都不一定对
作者: 呆呆沙师妹    时间: 2014-4-16 14:34
曹冬明 发表于 2014-4-16 14:26
可别这么说,我也没考虑全面,应该把你说的和我说的结合到一起,如果没有覆盖equals比较的是地址,如果覆 ...

嗯,你说得的对。哈哈,光这个讨论,就把这帖子给顶起来了。
作者: sheng6699    时间: 2014-4-16 16:01
1  set.contains(sk)  //你没有把  sk对象 通过put 添加到map里。KeySet必然不包含sk对象。你只是把匿名的对象添加到map 里 。





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