标签:java hashcode equals abstract-data-type custom-object
所以我有很多自定义类,其中也有使用组合的自定义clases.
我的自定义类具有非常频繁更改的变量,我将它们添加到HashSet.所以我的问题是当我实现hashCode时
– 对于只有私人领域不断变化的班级,我该怎么做?
以下是一个自定义类的示例:
public class Cell {
protected boolean isActive;
protected boolean wasActive;
public Cell() {
this.isActive = false;
this.wasActive = false;
}
// getter and setter methods...
@Override
public int hashCode() {
// HOW SHOULD I IMPLEMENT THIS IF THIS custom object is constantly
// being added into HashSets and have it's private fields isActive
// and wasActive constantly changed.
}
// ANOTHER QUESTION Am I missing anything with this below equals implementation?
@Override
public boolean equals(Object object) {
boolean result = false;
if (object instanceof Cell) {
Cell otherCell = (Cell) object;
result = (this.isActive == otherCell.isActive && this.wasActive ==
otherCell.wasActive);
}
return result;
}
解决方法:
Java中的Equals和hashCode契约:
当我们重写equals()方法时,我们必须覆盖hashCode(),Java中的equals方法必须遵循Java中与hashCode方法的约定,如下所述.
>如果两个对象等于equals()方法,那么hashcode必须
一样的
>如果两个对象不等于equals()方法,则会出现哈希码
可以相同或不同.
这些是您的类的equals和hashcode方法的示例实现:
//Hashcode Implementation
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + (isActive ? 1231 : 1237);
result = prime * result + (wasActive ? 1231 : 1237);
return result;
}
//equals Implementation
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cell other = (Cell) obj;
if (isActive != other.isActive)
return false;
if (wasActive != other.wasActive)
return false;
return true;
}
标签:java,hashcode,equals,abstract-data-type,custom-object 来源: https://codeday.me/bug/20190529/1177443.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。