Java集合查询

标签 java collections

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() 也可以,但我关注的是单词正确!!!

最佳答案

Equals 没有正确实现,它接受一个对象,而不是一个人作为参数。

编译不会因 private 修饰符而失败。私有(private)访问成员可以从整个周围类中访问。

这对于基于哈希的数据结构将无法正常工作,因为当 A.equals(B) 或 B.equals(A) 时,两个实例 A 和 B 的 hashCode() 必须相等。目前 hashCode 的默认实现是基于实例的,而不是 name 的等式。 .

是的,equals(Object)方法将用于确定 java.util.Set 中的条目是否确实相等;但是,如果它是基于哈希的 Set那么 hashCode() 可以用作确定相等性的捷径。如果hashSet()执行不正确,则Set可能决定不打电话equals(Object)之后,如hashCode() s 表示两个对象不能相等。

请注意 hashCode() 的正确实现可以明确地确定一个对象是否不等于,但不能明确地确定一个对象是否等于;专为 equals(Object) 保留。 HashCode()通常调用起来非常快,因此通常用于在实际调用 equals(Object) 之前放弃所需的相等性检查。以确定真正的平等。

请注意,此类缺少 equals(Object)方法(但它有一个类似名称的 equals(Person) 方法,由于方法签名错误,该方法不会用于相等性检查)。因此,此类将无法在 Set 中正常工作。如果目的是让每个名称在集合中包含一个条目。但是,默认实现equals(Object)有效,就像 hashCode() 的默认实现一样。它是专为匹配而定制的,因此它可以在 Set 范围内正常工作。 ;但是,仅当意图不在 Set 中存储同一实例两次时。

关于Java集合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616195/

相关文章:

java - 是否建议在字段中缓存 Collections.unmodifiableList() 结果?

java - 包org.apache.commons.collections.map不存在导入org.apache.commons.collections.map.MultiValueMap

python - 为什么在 PyMongo 中处理大型 MongoDB 集合时会丢失数据?我该怎么办?

java - 使用 java8 特性为字符串创建一个字符计数数组

java - 大目录处理缓慢

java - 无法解析迄今为止的 json 字符串

java - 如何避免 Scala 中继承字段的类型重复

java - 无法加载身份验证插件  'caching_sha2_password'

java - 由于 char(java) 无法编译 TestBookOrder

java - Java 中的深度比较集