English 中文(简体)
当我凌驾于平等的方法时,我为什么要凌驾于草原。
原标题:Why should I override hashCode() when I override equals() method?

奥基,我从许多地点和来源听到,只要我凌驾于平等方法之上,我就还需要超越惯用法。 但审议以下法典:

package test;

public class MyCustomObject {

    int intVal1;
    int intVal2;

    public MyCustomObject(int val1, int val2){
        intVal1 = val1;
        intVal2 = val2;
    }

    public boolean equals(Object obj){
        return (((MyCustomObject)obj).intVal1 == this.intVal1) && 
                (((MyCustomObject)obj).intVal2 == this.intVal2);
    }

    public static void main(String a[]){
        MyCustomObject m1 = new MyCustomObject(3,5);
        MyCustomObject m2 = new MyCustomObject(3,5);
        MyCustomObject m3 = new MyCustomObject(4,5);

        System.out.println(m1.equals(m2));
        System.out.println(m1.equals(m3));
    }
}

这里的产出是真实的,确切地说,是我想要的是,而且我全心全意地照顾到压倒过去的做法。 这意味着凌驾于一切之上是一种选择,而是一种强制性的选择。

我想得到第二次确认。

最佳回答

www.un.org/Depts/DGACM/index_spanish.htm 它为你工作,因为你的代码没有使用任何功能(HashMap, HashTable),这些功能需要<代码>hashCode(。

然而,你不知道以后在一部确实使用其物体作为散射钥匙的法典中是否将使用你的类别(通常不能作为一次性书写),在这种情况下,情况会受到影响。

根据

土库曼一般合同是:

  • 每当 Java申请执行期间在同一物体上被援引一次以上时,只要对同一物体进行平等比较时没有使用过任何信息,则原居地法必须始终如一地归还同样的惯性。 不必将申请的执行与同一申请的另一项执行保持一致。

  • www.un.org/Depts/DGACM/index_spanish.htm 如果两个物体按照等值(目标)方法平等,那么,在这两个物体中,每一物体必须采用相同的惯用法。

问题回答

由于哈希姆普/哈什姆将首先从原居地处研究物体。

如果这些地图不相同,则该地图将声称物体与地图上不存在。

页: 1 《<>>超载>既不是,也不是两者的,是因为它们与APIC的其余部分交织在一起的。

阁下发现,如果你将<代码>m1输入,则该编码为<编码>contains(m2)。 这是不一致的行为,可造成大量ug和混乱。

Java图书馆拥有吨的功能。 为使他们工作for<>em>,你需要按照规则行事,并确保<条码>平等<>和<条码>一致>。

多数其他评论已经给你答案:你之所以需要做,是因为有收集资料(例如:HashSet, HashMap)将原样用作“指数”物体的最优化,这些评论估计,如果:a. Equals(b)=>a.hashCode()=b.hashCode(>(NOTE:斜体字节)。

但是,作为你可以做的补充信息:

class Box {
     private String value;
     /* some boring setters and getters for value */
     public int hashCode() { return value.hashCode(); }
     public boolean equals(Object obj) { 
           if (obj != null && getClass().equals(obj.getClass()) { 
               return ((Box) obj).value.equals(value); 
            } else { return false; }
     }
}

为此:

Set<Box> s = new HashSet<Box>();
Box b = new Box();
b.setValue("hello");
s.add(b);
s.contains(b); // TRUE
b.setValue("other");
s.contains(b); // FALSE
s.iterator().next() == b // TRUE!!! b is in s but contains(b) returns false

你从这个例子中了解到的情况是,实施<代码>等于 或,其性质可以改变(可变)是实在坏的。

在收集(即哈希姆普、哈希特等)时,首先必须寻找使用其原样价值的物体。 因此,每一物体回归不同的hCode(hCode)价值,你必须超越这一方法,根据物体的状况,不断产生一种hCode值,以帮助收集算法确定散列表中的数值。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...