1:
单选题
某个ADT的Rep是:
private int no;
private String name;
它的AF是:
AF(no) == ID of a student
那么以下equals()正确的是__
A return this.no == that.no
B return this.no == that.no && this.name == that.name
C return this.no == that.no && this.name.equals(that.name)
D return this.name.equals(that.name)
正确答案:A
个人分析:这道题有点小迷,个人感觉AC都对,确实ID是唯一的而姓名不唯一,但是若ID相等,姓名应该是一定相等的,所以感觉C也没问题。更加细致的思考,如果真的要打代码A一定是最好的,因为判断姓名没有意义,综上还是得选A
Date d = new Date(2019,4,1);
Set<Date> hs = new HashSet<>();
Set<Date> ts = new TreeSet<>();
hs.add(d);
ts.add(d);
d.setYear(2020);
println(hs.contains(d));
println(ts.contains(d));
该代码执行之后会打印出____
A True; True
B True; False
C False; True
D False; False
正确答案:C
答案解析:
hashCode,顾名思义…
mutable对象的hashCode变化之后,只会影响受hashSet,不会影响TreeSet
个人分析:
查得hashSet的插入操作:
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。
(来自:HashSet和TreeSet有什么区别?https://blog.csdn.net/xiangyuenacha/article/details/84255629)
也就是在hashSet中首先判断的是hashCode,而hashCode被改变了,导致程序认为这个元素不在该集合中。
但是,还是感觉这不算bug吗,HashSet和TreeSet同时实现的Set,应该享有相同的规约啊,也就是说无论是哪种实现,相同的操作后得到的结果应该是相同的,但是这里看来并非如此。
单选题
Date d = new Date(2019,4,1);
Date f = new Date(2019,4,1);
List<Date> al=new ArrayList<>();
List<Date> ll=new LinkedList<>();
al.add(d);
ll.add(f);
println(d.equals(f));
println(al.equals(ll));
该代码执行之后输出的是____
A True; True
B True; False
C False; True
D False; False
正确答案:A
答案解析:
Date是mutable的,它实现的是观察等价性,所以d和f两个值等价。
List也是mutable的,实现的也是观察等价性,所以判断其中每个元素的等价性,而d与f是等价的,故al和ll也是等价的。这个跟具体的类型(ArrayList和LinkedList)无关。
个人分析:
这道题没什么难点,只是用来和上道题做个对比
习题来源:
https://blog.csdn.net/HITcs_Sxf/article/details/88706303