需要基本java equals()覆盖帮助
我目前正在用java编写一个简单的行程序。没有实际的GUI,因此它完全基于文本 我们需要有一个点类和一个线类,其中包括点对象 我遇到的问题涉及point类的equals方法。考虑到每个点只有两个正的int值,一个x和一个y,我在这里遇到了问题,我担心我在比较线条时会遇到问题,这涉及到比较点、int宽度和字符串颜色 这就是我的point类的equals方法的代码需要基本java equals()覆盖帮助,java,equals,overriding,Java,Equals,Overriding,我目前正在用java编写一个简单的行程序。没有实际的GUI,因此它完全基于文本 我们需要有一个点类和一个线类,其中包括点对象 我遇到的问题涉及point类的equals方法。考虑到每个点只有两个正的int值,一个x和一个y,我在这里遇到了问题,我担心我在比较线条时会遇到问题,这涉及到比较点、int宽度和字符串颜色 这就是我的point类的equals方法的代码 @Override public boolean equals(Point that) { if(this==that)
@Override
public boolean equals(Point that) {
if(this==that)
return true;
//if
if(this.x==that.getX() && this.y==that.getY())
return true;
return false;
}
任何帮助都将不胜感激。签名需要包含对象,而不是点。然后,您需要进行明显的检查,以确保对象实际上是一个点,并且它是非空的 除此之外,正如你所说的,我认为这个方法没有任何问题,它是自反的,对称的,一致的,传递的。如果你的类使用了double,那么我会说在比较它们的时候加上一个delta值——但很明显,用int这不是问题
但间接的问题是,您确实应该重写hashcode,以便以相同的方式进行操作,否则在将点添加到使用
hashcode()
的集合时,您可能会遇到奇怪的问题(根据约定,他们应该以相同的方式比较对象)。签名需要包含对象,不是重点。然后,您需要进行明显的检查,以确保对象实际上是一个点,并且它是非空的
除此之外,正如你所说的,我认为这个方法没有任何问题,它是自反的,对称的,一致的,传递的。如果你的类使用了double,那么我会说在比较它们的时候加上一个delta值——但很明显,用int这不是问题
但间接的问题是,您确实应该重写hashcode,以便以相同的方式进行操作,否则在将点添加到使用
hashcode()
的集合时,您可能会遇到奇怪的问题(根据约定,它们应该以相同的方式比较对象)。对于一个简单的类,仅包含两个整数,以下hashCode和equals方法适用:
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
对于仅包含两个整数的简单类,以下hashCode和equals方法是合适的:
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
你展示了Line类的equals方法,但我认为一条线不能等于一个点。直线可以包含一个点。你是说点等于方法吗?你展示了Line类等于方法,但我认为一条线不能等于一个点。直线可以包含一个点。你是说Point equals方法吗?你的问题似乎是关于性能和Object.equals()方法。您应该阅读以下内容:
您的类应该重写hashCode()方法。您的问题似乎与性能和Object.equals()方法有关。您应该阅读以下内容:
您的类应该重写hashCode()方法。查看Object.equals()方法的定义。特别要注意参数的类型。equals()的任何重写必须具有对象参数
public boolean equals(Object that) { ... }
请看Object.equals()方法的定义。特别要注意参数的类型。equals()的任何重写必须具有对象参数
public boolean equals(Object that) { ... }
让我试试这个:
@Override
public boolean equals(Object o)
{
//Cast the object o to Point instance
if(!(o instanceof Point))
return false;
Point obj = (Point)o;
if(obj==null)
return false;//Checking if null
else if.....//test properties using cast object obj
}
让我试试这个:
@Override
public boolean equals(Object o)
{
//Cast the object o to Point instance
if(!(o instanceof Point))
return false;
Point obj = (Point)o;
if(obj==null)
return false;//Checking if null
else if.....//test properties using cast object obj
}
问题到底是什么?另外,该代码显然来自Point类,而不是Line类。我不明白您的问题是什么,实际上…
.equals()
接受一个对象。您需要确保对象不是空的,并且类型正确。很抱歉,它的措辞太糟糕了。我想我已经把一切都搞定了。问题到底是什么?另外,该代码显然来自Point类,而不是Line类。我不明白您的问题是什么,实际上….equals()
接受一个对象。您需要确保对象不是空的,并且类型正确。很抱歉,它的措辞太糟糕了。我想我已经把一切都安排好了。谢谢你。我想知道为什么IDE告诉我它不是覆盖等式。另一件我不明白的事情是如何/为什么需要/编辑hashcode。没问题-请参阅此处以获得深入的解释:如果要比较的对象为null,则问题中的方法将抛出null指针异常。一定要检查空值。谢谢。我想知道为什么IDE告诉我它不是覆盖等式。另一件我不明白的事情是如何/为什么需要/编辑hashcode。没问题-请参阅此处以获得深入的解释:如果要比较的对象为null,则问题中的方法将抛出null指针异常。确保检查是否为空。重载?你是说超负荷?超负荷?你是说超控吗?