【java】「小马哥每日一问」2019.07.10 期
问题描述
public class Name {private String first, last;
public Name(String first, String last) {
if (first == null || last == null)
throw new NullPointerException();
this.first = first;
this.last = last;
}
public boolean equals(Name o) {
return first.equals(o.first) && last.equals(o.last);
}
public int hashCode() {
return 31 * first.hashCode() + last.hashCode();
}
public static void main(String[] args) {
Set s = new HashSet();
s.add(new Name("Mickey", "Mouse"));
System.out.println(s.contains(new Name("Mickey", "Mouse")));
}
}
以上程序输出内容是?
(a) true
(b) false
(c) 程序编译错误
(d) 以上都不是
注:每期的「小马哥每日一问」将累计在「小马哥技术周报」 直播中解答
回答
false, 应该是hashcode 判断的结果是相等,因为没有重写equals()方法,走的是Object的equals(),和 == 一样。比较的是地址值。故不相等但是如果将代码修改为这个就是true
选b false
因为没有重写equals方法
将equals方法改为
@Override
public boolean equals(Object obj) {
Name name = (Name) obj;return first.equals(name.first) && last.equals(name.last);
}
即可为true
选 (b) false, 没有重写equals()方法,contains调用的是Object的equals()方法。
输出false ,没有重写equal
惭愧。。。最开始以为是true,后来测试了下才发现equals方法入参应该是Object,这里是Name...所以结果是false。但是为什么没进重载???没想通啊
false,override equals方法参数是object
equals上加个@Override,Name对象通过强转。
false
false
contains方法内部调用的是Object.equals
false,没有重写equals方法,只是重载了
学习了,牛逼
false
false
因为没有重写Object的equals方法
没看见@Override
留下足迹......
以上是 【java】「小马哥每日一问」2019.07.10 期 的全部内容, 来源链接: utcz.com/a/74216.html