equals和hashCode

来源:互联网 发布:xp添加网络打印机 url 编辑:程序博客网 时间:2024/06/06 09:50

比较两个东西一模一样有两种情况:

  1、比较的东西就是一个东西。

  2、比较的东西是相同的,是一个模子里刻出来的。

    在计算机的世界里符号  “==”就是第一种情况,也就是说:两个变量在进行比较时,比较的是变量的引用地址。

    equals比较的是第二种情况,比较的是变量的内容(默认情况下是这样的),其实equals是可以重写的。

    举个例子:现在有两条绳子同时前者一条狗。这绳子都代表着狗。然后==比较的时候,比较的是绳子指向的地址。

而现在有两条狗,equals比较的时候就是比较的是内容了。

  equals和hashC

ode方法的重写

  在比较两个对象是否为同一个对象时,就得重写equals和hashCode方法了。

重写equals方法时候重写hashcode方法的主要目的就是让Hashtable/HashSet/HashMap等集合正常工作,也就是说他们都是基于hashcode进行地址判断的,如果重写equals而不重写hashcode,对于HashMap来说存入2个相同的对象保存一个key,却对应2个值,而取的时候是无法取出值,其它的集合类也是类似,为了不至于混乱出错,所以以上集合类重写equals时候必须重写hashcode方法。是不是其它的类也是的呢?我认为不完全是,因为普通类重新hashcode意义不大,不写也不会出现编译错误,但SUN(ORACLE)官方规定,还是按照规定来吧,只其然也要知其所然。

看下面小小的Demo

import java.util.*;class Person{private String name;private int age;public Person(String name, int age){this.name = name;this.age = age;}public String toString(){return "姓名:" + this.name +",年龄:"+this.age;}//重写equals和重写hashCode方法public boolean equals(Object obj){if(obj instanceof Person){Person m = (Person)obj; return(name==m.name && age==m.age)                                                           //return (name == m.name);}return super.equals(obj);}public int hashCode(){return this.name.hashCode()+this.age;}};public class AdvTest{public static void main (String args[]){/*Map m = new HashMap();m.put("张三",new Person("张三"));System.out.println(m.get("张三"));*///********************************Map m = new HashMap();m.put(new Person("张三",31),"张三,31");System.out.println(m.get(new Person("张三",30)));//******************************/*Map m = new HashMap();Person p = new Person("张三");m.put(p,"张三");System.out.println(m.get(p));*/}};

如有错误,还请指出,十分感激啊。



    


0 0