读书人

为什么答案是B该如何解决

发布时间: 2012-01-22 22:38:43 作者: rapoo

为什么答案是B,
Given:
11. public class Person {
12. private name;
13. public Person(String name) {
14. this.name = name;
15. }
16. public boolean equals(Object o) {
17. if( !o instanceof Person ) return false;
18. Person p = (Person) o;
19. return p.name.equals(this.name);
20. }
21. }
Which is true?
A. Compilation fails because the hashCode method is not overridden.
B. A HashSet could contain multiple Person objects with the same
name.
C. All Person objects will have the same hash code because the
hashCode method is not overridden.
D. If a HashSet contains more than one Person object with
name=”Fred”, then removing another Person, also with name=”Fred”,
will remove them all.


[解决办法]
因为其它的答案是错的,Person对象加入HashSet时是作为value而不是key,当然想怎么放就怎么放
[解决办法]
Person 只是重写了equals的方法,没有重写hashCode()的方法,所以即使有多个相同名字的Person对象,他们的hashCode()仍然不一样,所以HashSet允许他们同时存在, B 正确
[解决办法]
关注
[解决办法]
这个问题的关键在于HashSet判断两个对象相同时,是用hashCode()相等进行判断,还是调用对象的equals(Object)方法。

虽然之前我不知道,但是根据答案可以反推,HashSet是用前一种方式判断的。

A答案不正确,因为Person可以不重写hashCode()方法。

当类没有重写hashCode()方法时,同一个类的两个对象调用hashCode()返回的值应该是不同的(可以查查JAVA DOC)。和name属性应该是没有关系的……

所以答案C、D是错的……
[解决办法]
应该是先比较hashCode(),然后用equals()比较。
[解决办法]
英语不太好,但是程序的12句没定义name的类型
[解决办法]
原来有这么多高手啊 而且英语都特别好
我都看不太懂
[解决办法]
支持一下三楼 V_Naga(那加)
没有重写hashCode()方法,hashCode()仍然返回由内存地址生成的一个整数,new了不同的对象,其值也不同,就可以放进hashset了
ps:楼主是不是贴的不全啊,定义name前的String,还有if( !o instanceof Person ) return false;是不是应该为if( !(o instanceof Person )) return false;?
A选项如果去掉because后面的就对了,呵呵

读书人网 >J2SE开发

热点推荐