我一直没能弄明白何时重写hashCode(),怎样重写hashCode()。我现在明白的有:生成两个对象同时,会生成对应的散列码,当需要比较两个对象时,java先比较他们的hashCode,若不同,则两个对象就不同,若相同,再比较equals()方法,判断是否相同。
可是我还是没能弄明白上面的那两个问题。
各位帅哥帮我解决一下好吗,最好能举一下例子,或则用一些形象的比喻比较好理解。先谢过了!!!!
------解决方案--------------------
打个比方,hashCode() 方法是好比是字典前面的目录,有了这个目录你查东西就会快的多,equals方法是比较的内容,就好比根据目录查内容。同一个的内容自然要有唯一的目录,所以hashCode和equals方法一般一起实现。比如Student类的equals方法根据name,school,age重写的,那么hashCode也要根据这三个属性去散列存储的地址。hash表的数据结构是链表的数组,即每个数组元素都是一个链表,链表中存的是hashCode值相等的元素,所以根据hashCode能快速的查找。Eclipse有自动生成的写法,你可以自己生成看看。但是hashCode的具体写法要依据情况去写,没固定写法。
------解决方案--------------------
楼上那个人已经说得不错了。你知道Set这个集合是不能存相同内容的吗?它判断相同内容的依据就是存进去的这个对象与set这个集合里面存在的各个对象的hashcode比较是否相同。如果相同,就存不进去。
我大概写个例子吧
- Java code
public class Person { int age; String name; public Person(){} public Person(String name,int age){ this.age = age; this.name=name; } @Override public boolean equals(Object obj) { System.out.println(this.name+":调用equals,想用什么方式比较自己写"); Person p = (Person)obj; return this.age==p.age?true:false; } @Override public int hashCode() { System.out.println(this.name+":先调用hashCode,想用什么方式比较自己写,若想同,再调用equals"); return age; } public static void main(String[] args) { HashSet<Person> persons = new HashSet<Person>(); Person p1=new Person("a",1); Person p2=new Person("b",1); Person p3=new Person("c",2); persons.add(p1); persons.add(p2); persons.add(p3); for(Person p:persons){ System.out.println(p.age); } }}
------解决方案--------------------
------解决方案--------------------
覆盖equals时总要覆盖hashcode.
查看Effective java 一书第9条建议,给出了一种hashcode的简单覆盖方案,本来想贴出来的,太长了,你自己看吧