public class Person {
private String name;
public Person(String name) { this.name = name; }
public boolean equals(Person p) {
return p.name.equals(this.name);
}
} Which statement is true?
A. The equals method does NOT properly override the Object.equals method.
B. Compilation fails because the private attribute p.name cannot be accessed in line 5.
C. To work correctly with hash-based data structures, this class must also implement the
hashCode method.
D. When adding Person objects to a java.util.Set collection, the equals method in line 4 will
prevent duplicates.
Answer: A这是一个模拟考试的问题,我正在为ocjp 6做准备,我对选项C有疑问。它说“要正确工作”,这不意味着需要重写hashcode吗?虽然不覆盖hashcode()是可行的,但我关注的是正确的单词!!
发布于 2013-09-04 14:15:18
“等于”没有正确实现,它接受一个对象,而不是一个人作为参数。
编译不会因为私有修饰符而失败。私有访问成员可以从整个周围的类中访问。
这在基于哈希的数据结构中不能正确工作,因为对于两个实例A和B,当hashCode(B)或B.equals(A)时,必须等于B.equals()。目前,hashCode的默认实现是基于实例,而不是基于name的相等。
是的,equals(Object)方法将用于确定条目在java.util.Set中是否确实相等;但是,如果它是基于哈希的Set,那么hashCode()可以用作确定相等性的捷径。如果hashSet()没有正确实现,那么Set可能决定以后不调用equals(Object),因为hashCode()表示这两个对象不能相等。
请注意,hashCode()的适当实现可以确定一个对象是否等于,但它不能确定一个对象是否等于;这完全是为equals(Object)保留的。HashCode()通常调用速度非常快,因此通常用于在实际调用equals(Object)以确定真正相等之前放弃所需的等式检查。
注意,这个类缺少一个equals(Object)方法(但是它有一个类似的名为equals(Person)的方法,由于错误的方法签名,它不会在等式检查中使用)。因此,如果这个类的意图是在每个名称的集合中有一个条目,那么这个类在Set中将不能正常工作。但是,equals(Object)的默认实现是有效的,hashCode()的默认实现也是有效的,这是为匹配而量身定制的,因此它将在Set中正确工作;但是,只有当意图不将同一个实例两次存储在Set中时,它才能正常工作。
发布于 2013-09-04 14:19:57
答案C是正确的!您还必须在qay中实现hashCode方法,即两个相同的人也有相同的哈希码。
如果不这样做,则可以将一个人放入基于哈希的数据结构中,但不能用另一个实例(等于第一个实例)找到它。
示例:
Person p1 = new Person("me");
Person p2 = new Person("me");
System.out.println(p1.equals(p2)); // prints true
Set<Person> persons = new HashSet<>();
persons.add(p1);
System.out.println(persons.contains(p2)); // prints false (which should be wrong)https://stackoverflow.com/questions/18616195
复制相似问题