JAVA中重写equals()方法的同时要重写hashcode()方法
2014-05-22 09:24
253 查看
object对象中的publicbooleanequals(Objectobj),对于任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才返回true; 注意:当此方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下: (1)当obj1.equals(obj2)为true时,obj1.hashCode()==obj2.hashCode()必须为true (2)当obj1.hashCode()==obj2.hashCode()为false时,obj1.equals(obj2)必须为false 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象 (如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址 hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。 这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象, 当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象, 导致混淆,因此,就也需要重写hashcode() 举例说明:
importjava.util.*; publicclassHelloWorld{ publicstaticvoidmain(String[]args){ /* Collectionc=newHashSet(); c.add("hello"); c.add(newName("f1","l1")); c.add(newInteger(100)); c.remove("hello"); c.remove(newInteger(100)); System.out.println(c.remove(newName("f1","l1"))); */ Namen1=newName("01"); Namen2=newName("01"); Collectionc=newHashSet(); c.add(n1); System.out.println("------------"); c.add(n2); System.out.println("------------"); System.out.println(n1.equals(n2)); System.out.println("------------"); System.out.println(n1.hashCode()); System.out.println(n2.hashCode()); System.out.println(c); } } className{ privateStringid; publicName(Stringid){ this.id=id; } publicStringtoString(){ returnthis.id; } publicbooleanequals(Objectobj){ if(objinstanceofName){ Namename=(Name)obj; System.out.println("equal"+name.id); return(id.equals(name.id)); } returnsuper.equals(obj); } publicinthashCode(){ Namename=(Name)this; System.out.println("Hash"+name.id); returnid.hashCode(); } }
就这个程序进行分析,在第一次添加时,调用了hashcode()方法,将hashcode存入对象中,第二次也一样,然后对hashcode进行比较。hashcode也只用于HashSet/HashMap/Hashtable类存储数据,所以会用于比较,需要重写
总结,自定义类要重写equals方法来进行等值比较,自定义类要重写compareTo方法来进行不同对象大小的比较,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable类时进行比较
相关文章推荐
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中自定义对象比较时重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- Java基础之重写equals方法的同时为什么要重写hashCode方法
- JAVA中重写equals()方法的同时要重写hashcode()方法
- java中重写equals()方法的同时要重写hashcode()方法(详解)
- 【Java基础】JAVA中重写equals()方法为什么要重写hashcode()方法?
- ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
- JAVA中重写equals()方法为什么要重写hashcode()方法?