黑马程序员------- "==",equals和hashcode

来源:互联网 发布:java群ping 编辑:程序博客网 时间:2024/06/06 15:04
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

  在java中,可以通过==和equals()来比较变量和对象是否相同,那么他们都哪些区别呢
  首先是变量

int x = 1;int y = 1;System.out.println(x==y);   //返回trueSystem.out.println(x.equals(y)); //编译无法通过

  打开java源码查看equals()方法发现,只有两边都是一个Object的实例才可以进行比较,所以八种基础类型只能通过"=="来比较,转换成对应的包装类型后就可以进行比较。示例:

Integer x = new Integer(1);Integer y = 1;Integer z = 1;System.out.println(x.hashCode());//返回值为1System.out.println(y.hashCode()); //返回值为1System.out.println(x==y);        //他们引用的不是一个对象,返回falseSystem.out.println(x.equals(y));//hash值相同,返回trueSystem.out.println(z==y);//指向同一内存地址,返回true

  尽管三个Integer实例都是1,但是x并非直接引用,而是new了一个新实例,所以使用"=="为false,那么为什么equals()返回true呢?查看Integer源码发现Integer的equals是通过转换成int再"=="的方法。

 

public boolean equals(Object obj) {      if (obj instanceof Integer) {          return value == ((Integer)obj).intValue();      }      return false;  }


再重新给他们赋值,发现了有趣的现象

int x = 200;int y = 200;Integer i=200; Integer j=200; System.out.println(x==y);           //trueSystem.out.println(i==j);          //false      System.out.println(i.equals(j));    //true 

    i和j虽然都是200,但他们的200却是不同的对象,因为Integer 对-128~127做了类似缓存的处理,这个范围内的值可以认为都是从一个池里面取出来的。不在这个范围的可以认为他new了一个新的对象,地址不同。
  
  "=="是通过内存中地址判断是否相等,就联想到hashCode()。
  hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。因此,两个同类对象相等,他们的hashCode肯定是相同。但是hashCode相同,却不一定是相同的对象。我们在给一个类定义equals方法时,很有必要重写他的hashCode方法。
  在hashSet和hashMap中,则一定要重写hashCode方法,不然会出现元素重复。

class Demo{private int x;Demo(int x){this.x = x ;}public static void main (String []args) {Demo d1 = new Demo(3);Demo d2 = new Demo(3);System.out.println(d1.hashCode());System.out.println(d2.hashCode());}}

  "=="则是对比两个变量或者对象的引用是否相同。
  equals()是java.lang.Object类的方法,在Object中,equals()直接调用了"==",返回true或false。子类可以通过重写来重新定义比较方法,通过字符数字等其余数学判断是否相同。
  hashCode()和equals虽然没有必然的关系,但是他们在判断对象是否相同,可以互相参考。

0 0
原创粉丝点击