创建一个多态等于表达式

时间:2014-03-24 23:26:23

标签: java polymorphism equals

我的问题是在java中改变表达式以使其具有多态性。该类称为csHash,用于从给定的数据类型DT和给定的键类型KT创建哈希表。现在,在类中的几个方法(删除,搜索,插入等)中,该方法使用一个equals函数,在非多态版本中,它只使用String(因为非多态版本中的键是该类型的串)。我在想的是创建一个equals方法,写成以下代码的内容。我的问题是......它是否是衡量平等的有效手段?

public boolean equals(Object x) {
    String i;
    i = new String[1];     
    String y;
    y = new String[1];
    i == i + this;              // use the + operator to add 'this' object
    y == y + (findkey(other))x; // do the same for other object. findkey methods returns KT for a given object, i use this return to typecast the Object x.
    int j = i.compareTo(y);     // use built in String compare method

    if(j = 0) {return true;}    // use if else to determine if they are equal
    else {return false;}
}

2 个答案:

答案 0 :(得分:0)

我首先阅读规范:

  

指示某个其他对象是否“等于”此对象。

     

equals方法在非null上实现等价关系   对象引用:

     

它是自反的:对于任何非空引用值x,x.equals(x)   应该回归真实。它是对称的:对于任何非空参考值   当且仅当y.equals(x)时,x和y,x.equals(y)应该返回true   返回true。它是传递性的:对于任何非空参考值x,   y和z,如果x.equals(y)返回true而y.equals(z)返回true,   那么x.equals(z)应该返回true。这是一致的:对任何人   非空引用值x和y,x.equals(y)的多次调用   如果不是,则始终返回true或始终返回false   在对象的等比较中使用的信息被修改。对于   任何非空引用值x,x.equals(null)都应返回false。   类Object的equals方法实现最具辨别力   对象可能的等价关系;也就是说,对于任何非null   引用值x和y,当且仅当x时,此方法返回true   和y引用相同的对象(x == y的值为true)。

     

请注意,通常需要覆盖hashCode方法   每当重写此方法时,都要保持一般   hashCode方法的契约,它声明了相等的对象必须   有相同的哈希码。

换句话说,只要给出三个对象x,y和z,下面的内容就会成立:

x.equals(y) implies y.equals(x)
!x.equals(y) implies !y.equals(x)
x == y implies x.equals(y)
x.equals(y) && y.equals(z) implies x.equals(z)

如果你的equals方法遵循这个契约,那么它就是一个有效的Java Object.equals实现。您可以非常轻松地为此创建大量的单元测试,以确保涵盖所有极端情况。

请注意,您还必须使用相关行为覆盖hashCode。

答案 1 :(得分:0)

您的equals方法存在问题,因为它不会将两个哈希表与存储桶中的所有项进行比较。它也不排除某些情况。 equals类中CSHash方法的示例覆盖如下所示,以满足equals方法的一般准则:

    @Override
    public boolean equals(Object o) {
        if (o == null)
            return false;
        if (this == o)
            return true;
        if (!(o instanceof CSHash))
            return false;
        CSHash other = (CSHash) o;
        return this.entrySet().equals(other.entrySet());
    }

这里假设您在entrySet()类中定义了CSHash方法以返回哈希表的集合。您可以定义自己的entrySet()方法,类似于Java的HashMap类中的方法。