Java集合查询

Java集合查询,java,collections,Java,Collections,这是一个模拟考试的问题,我正在准备ocjp 6,我对选项C有疑问。它说“正确工作”,所以这不意味着需要覆盖哈希代码吗?虽然不重写hashcode()会起作用,但我会正确地关注这个词 是的,答案C是正确的 你正确地关注这个词是对的。为了使这个类能够正确地使用基于散列的结构,它必须按照equals hashCode契约以与equals()的实现一致的方式实现“hashCode()” 从javadoc for hashcode()中: hashCode的总合同为: 每当在同一对象上多次调用时 在Jav

这是一个模拟考试的问题,我正在准备ocjp 6,我对选项C有疑问。它说“正确工作”,所以这不意味着需要覆盖哈希代码吗?虽然不重写
hashcode()
会起作用,但我会正确地关注这个词

是的,答案C是正确的

你正确地关注这个词是对的。为了使这个类能够正确地使用基于散列的结构,它必须按照equals hashCode契约以与equals()的实现一致的方式实现“hashCode()”

从javadoc for hashcode()中:

hashCode的总合同为:

每当在同一对象上多次调用时 在Java应用程序的执行过程中,hashCode方法必须 一致返回相同的整数,前提是在 修改对象上的相等比较。这个整数不需要 从应用程序的一次执行到另一次执行保持一致 同一应用程序的执行。
  • 如果两个对象相等 根据equals(Object)方法,然后调用hashCode 方法必须生成相同的整数 结果。
  • 如果两个对象不相等,则不需要 根据equals(java.lang.Object)方法,然后调用 两个对象上的hashCode方法必须产生不同的 整数结果。但是,程序员应该知道 为不相等的对象生成不同的整数结果可以提高 哈希表的性能。

  • Equals没有正确实现,它以对象而不是人作为参数

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

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

    是的,
    equals(Object)
    方法将用于确定
    java.util.Set
    中的条目是否确实相等;但是,如果它是基于哈希的
    ,则hashCode()可以用作确定相等性的捷径。如果
    hashSet()
    的实现不正确,则
    Set
    可能会决定以后不调用
    equals(Object)
    ,因为
    hashCode()
    s指示这两个对象不能相等

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


    请注意,此类缺少
    equals(Object)
    方法(但它有一个类似的名为
    equals(Person)
    的方法,由于方法签名错误,该方法将不会用于相等性检查)。因此,如果意图是在每个名称的集合中有一个条目,则此类将无法在
    集合中正常工作。但是,
    equals(Object)
    的默认实现是有效的,
    hashCode()
    的默认实现也是有效的,这是根据匹配情况定制的,因此它将在
    集合中正常工作;但是,仅当目的是不在
    集中存储同一实例两次时

    答案C是正确的!您还必须在qay中实现hashCode方法,即两个相等的人也具有相同的hashCode

    如果不这样做,则可以将一个人放入基于哈希的数据结构中,但无法在另一个实例中找到它(该实例等于第一个实例)

    例如:

        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
    
    Person p1=新人(“我”);
    人员p2=新人员(“我”);
    System.out.println(p1.等于(p2));//打印正确
    Set persons=new HashSet();
    新增(p1);
    System.out.println(persons.contains(p2));//打印错误(应该是错误的)
    
    C与
    equals
    是否正确实现无关,反之亦然。A和C都是正确的,这就是我的想法。谢谢你的澄清,谢谢你的详细回答。
        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
    
    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)