我的问题是在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;}
}
答案 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类中的方法。