当覆盖java.lang.Object的equals()函数时,javadocs建议,
通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相等的哈希代码.
hashCode()方法必须为每个对象返回一个唯一的整数(这在基于内存位置比较对象时很容易,只需返回对象的唯一整数地址)
应该如何覆盖hashCode()方法,以便它仅基于该对象的特性为每个对象返回一个唯一的整数?
public class People{
public String name;
public int age;
public int hashCode(){
// How to get a unique integer based on name and age?
}
}
/*******************************/
public class App{
public static void main( String args[] ){
People mike = new People();
People melissa = new People();
mike.name = "mike";
mike.age = 23;
melissa.name = "melissa";
melissa.age = 24;
System.out.println( mike.hasCode() ); // output?
System.out.println( melissa.hashCode(); // output?
}
}
Run Code Online (Sandbox Code Playgroud) 所以这更像是一个"试图理解"的问题,而不是"我需要一个解决方案"的问题.对于作业,我们要求创建一个产品列表,其中包含a itemNumber和a price,但每个产品只有一个,因此没有相同的项目itemNumber.我想我可以创建一个集合,这将摆脱重复问题.但如果我添加producta1,4.99和productb1,2.99,则会添加两个产品.
这是否意味着,该集合确定这些产品是不同的b/c它们具有不同的价格,因此可以添加到集合中?
我读到要在java中使用equals()方法我们还必须覆盖hashcode()方法,并且相等(逻辑)对象应该具有eual哈希码,但这并不意味着基于引用的相等!这是我的重写equals()方法的代码,我应该如何覆盖hashcode方法:
@Override
public boolean equals(Object o)
{
if (!(o instanceof dummy))
return false;
dummy p = (dummy) o;
return (p.getName() == this.getName() && p.getId() == this.getId() && p.getPassword() == this.getPassword());
}
Run Code Online (Sandbox Code Playgroud)
我只是想了解它是如何工作的,所以只有三个字段,即名称,id和密码,只是试图比较我在main()中定义的两个对象!我还需要知道是否总是需要覆盖hashcode()方法和equals()方法?