使用equals方法比较两个对象,Java
Posted
技术标签:
【中文标题】使用equals方法比较两个对象,Java【英文标题】:Comparing two objects using an equals method, Java 【发布时间】:2011-04-26 10:50:33 【问题描述】:我有一个要与目标对象进行比较的对象数组。我想返回与目标对象完全匹配的对象数。
这是我的计数方法:
public int countMatchingGhosts(Ghost target)
int count=0;
for (int i=0;i<ghosts.length;i++)
if (ghosts[i].equals(target));
count++;
return count;
这是我的 equals 方法:
public boolean equals(Ghost other)
if(this == other) return true;
if( !(other instanceof Ghost) ) return false;
Ghost p = (Ghost)other;
if (this.x == p.x && this.y == p.y && this.direction==p.direction && this.color.equals(p.color))
return true;
else
return false;
我运行了一些测试代码,我希望只有 1 个匹配,但我得到了 3 个。有没有发现任何错误?
【问题讨论】:
Ghost 有哪些字段,ghost 是如何初始化的?我认为该数组具有非唯一值。 【参考方案1】:您的if
末尾有一个;
:
if (ghosts[i].equals(target));
^
这使count++;
发生总是,无论您的equals
方法返回什么。
【讨论】:
这就是为什么我总是使用大括号。我花了 2 天时间才找到类似的东西。再也不会...【参考方案2】:你应该重写这个函数:
public boolean equals(Object other)
请注意方法签名中使用的Object
类而不是Ghost
。如果您没有正确使用方法签名,您可以使用@Override
注释来获取编译器错误。
@Override
public boolean equals(Object other)
话虽如此,您的代码中可能发生的事情就是另一个答案所说的......
【讨论】:
【参考方案3】:只是想我补充一点,在您的代码中实现equals
方法时,您还必须实现(覆盖)hashCode
方法。这是为了获得最佳性能而必须遵守的一般合同。
以下是Joshua Bloch
的书"Effective Java"
的摘录
第 9 项:在覆盖 equals 时始终覆盖 hashCode
A common source of bugs is the failure to override the hashCode method. You
must override hashCode in every class that overrides equals. Failure to do so
will result in a violation of the general contract for Object.hashCode, which will
prevent your class from functioning properly in conjunction with all hash-based
collections, including HashMap,HashSet, and Hashtable.
Here is the contract, copied from the Object specification [JavaSE6]:
• Whenever it is invoked on the same object more than once during an execution
of an application, the hashCode method must consistently return the
same integer, provided no information used in equals comparisons on the
object is modified. This integer need not remain consistent from one execution
of an application to another execution of the same application.
• If two objects are equal according to the equals(Object) method, then calling
the hashCode method on each of the two objects must produce the same
integer result.
正如 Pablo 所说,如果您在 equals
方法签名中使用除 Object
类以外的任何东西,您实际上并没有覆盖 equals
方法,您的程序将无法按预期运行。
以这个小程序为例,它将List
复制到Set
(不能包含重复项)并打印新的集合。尝试将equals(Object obj)
与equals(Item obj)
交换,看看运行程序时会发生什么。另外,注释掉hashCode()
方法,运行程序,观察使用与不使用的区别。
public class Item
private String name;
private double price;
private String countryOfProduction;
public Item(String name, double price, String countryOfProduction)
this.setName(name);
this.setPrice(price);
this.setCountryOfProduction(countryOfProduction);
public String getName()
return name;
public void setName(String name)
this.name = name;
public double getPrice()
return price;
public void setPrice(double price)
this.price = price;
public String getCountryOfProduction()
return countryOfProduction;
public void setCountryOfProduction(String countryOfProduction)
this.countryOfProduction = countryOfProduction;
public String toString()
return "Item Name: " + getName() + "\n" +
"Item Price: N" + getPrice() + "\n" +
"Country of Production: " + getCountryOfProduction() + "\n";
@Override
public boolean equals(Object obj)
if(!(obj instanceof Item))
return false;
if(obj == this)
return true;
Item other = (Item)obj;
if(this.getName().equals(other.getName())
&& this.getPrice() == other.getPrice()
&& this.getCountryOfProduction().equals(other.countryOfProduction))
return true;
else
return false;
public int hashCode()
int hash = 3;
hash = 7 * hash + this.getName().hashCode();
hash = 7 * hash + this.getCountryOfProduction().hashCode();
hash = 7 * hash + Double.valueOf(this.getPrice()).hashCode();
return hash;
public static void main (String[]args)
List<Item> items = new ArrayList<>();
items.add(new Item("Baseball bat", 45, "United States"));
items.add(new Item("BLUESEAL Vaseline", 1500, "South Africa"));
items.add(new Item("BLUESEAL Vaseline", 1500, "South Africa"));
Collection<Item> noDups = new HashSet<>(items);
noDups.stream()
.forEach(System.out::println);
【讨论】:
以上是关于使用equals方法比较两个对象,Java的主要内容,如果未能解决你的问题,请参考以下文章