html5中文学习网

您的位置: 首页 > 网络编程 > java教程 » 正文

java equals和==的区别详解_java_

[ ] 已经帮助:人解决问题

 大概说equals和==都比较的是什么:hfaHTML5中文学习网 - HTML5先行者学习网

  1. boolean tem = a == b;hfaHTML5中文学习网 - HTML5先行者学习网

  首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容。因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用int a = 1;这种形式来定义的变量)。如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较。而自动变量既不是类的实例也不是类的引用所以不能用equals()方法。hfaHTML5中文学习网 - HTML5先行者学习网

  2.boolean tem = a.equals("b");hfaHTML5中文学习网 - HTML5先行者学习网

  equals()方法一般用于比较的是对象的内容但是也有的情况下也会去比较两个对象的地址。hfaHTML5中文学习网 - HTML5先行者学习网

  接下来hfaHTML5中文学习网 - HTML5先行者学习网

  写一个测试程序hfaHTML5中文学习网 - HTML5先行者学习网

package com;import java.util.Date;public class test {  public static void main(String[] args) {    Integer integer1 = new Integer(1);    Integer integer2 = new Integer(1);    String str1 = new String("123");    String str2 = new String("123");    Date date1 = new Date();    Date date2 = new Date();    Double double1 = new Double("1.0");    Double double2 = new Double("1.0");    Boolean tem1 = new Boolean(true);    Boolean tem2 = new Boolean(true);    Object object1 = new Object();    Object object2 = new Object();    System.out.println("----Object------");    System.out.println(object1.equals(object2));    System.out.println(object1 == object2);    System.out.println(object1.equals(object1));    System.out.println(object1 == object1);    System.out.println("----Boolean------");    System.out.println(tem1.equals(tem2));    System.out.println(tem1 == tem2);    System.out.println("----Double------");    System.out.println(double1.equals(double2));    System.out.println(double1 == double2);    System.out.println("----Integer------");    System.out.println(integer1.equals(integer2));    System.out.println(integer1 == integer2);    System.out.println("----String------");    System.out.println(str1.equals(str2));    System.out.println(str1 == str2);    System.out.println("----Date------");    System.out.println(date1.equals(date2));    System.out.println(date1 == date2);  }} 

 结果:hfaHTML5中文学习网 - HTML5先行者学习网

----Object------hfaHTML5中文学习网 - HTML5先行者学习网
falsehfaHTML5中文学习网 - HTML5先行者学习网
falsehfaHTML5中文学习网 - HTML5先行者学习网
truehfaHTML5中文学习网 - HTML5先行者学习网
truehfaHTML5中文学习网 - HTML5先行者学习网
----Boolean------hfaHTML5中文学习网 - HTML5先行者学习网
truehfaHTML5中文学习网 - HTML5先行者学习网
falsehfaHTML5中文学习网 - HTML5先行者学习网
----Double------hfaHTML5中文学习网 - HTML5先行者学习网
truehfaHTML5中文学习网 - HTML5先行者学习网
falsehfaHTML5中文学习网 - HTML5先行者学习网
----Integer------hfaHTML5中文学习网 - HTML5先行者学习网
truehfaHTML5中文学习网 - HTML5先行者学习网
falsehfaHTML5中文学习网 - HTML5先行者学习网
----String------hfaHTML5中文学习网 - HTML5先行者学习网
truehfaHTML5中文学习网 - HTML5先行者学习网
falsehfaHTML5中文学习网 - HTML5先行者学习网
----Date------hfaHTML5中文学习网 - HTML5先行者学习网
truehfaHTML5中文学习网 - HTML5先行者学习网
falsehfaHTML5中文学习网 - HTML5先行者学习网

  首先对Object的比较,当比较的两个对象一样时,==和equals()的结果都是true,当两个对象不一样时返回的都是false。所以在==和equals用于比较对象时,他们比较的都是对象的地址,其实本质是一样的。下面是Object类中equals()方法的代码:hfaHTML5中文学习网 - HTML5先行者学习网

  public boolean equals(Object obj) {    return (this == obj);  }  

  而对于Boolean,Double(Float同理),Interger(Shot,Long同理),String,Date我也找了他们的源码,下面我依次贴出来在Boolean,Double,Interger,String,Date这些类中equals()方法的源码,这时候equals()方法就被重写了,因为这些类都是继承于Object类的嘛。hfaHTML5中文学习网 - HTML5先行者学习网

  Boolean:hfaHTML5中文学习网 - HTML5先行者学习网

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

  Double:hfaHTML5中文学习网 - HTML5先行者学习网

public boolean equals(Object obj) {    return (obj instanceof Double)        && (doubleToLongBits(((Double)obj).value) ==           doubleToLongBits(value));  }

  Interger:hfaHTML5中文学习网 - HTML5先行者学习网

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

  String:hfaHTML5中文学习网 - HTML5先行者学习网
hfaHTML5中文学习网 - HTML5先行者学习网

public boolean equals(Object anObject) {    if (this == anObject) {      return true;    }    if (anObject instanceof String) {      String anotherString = (String) anObject;      int n = value.length;      if (n == anotherString.value.length) {        char v1[] = value;        char v2[] = anotherString.value;        int i = 0;        while (n-- != 0) {          if (v1[i] != v2[i])              return false;          i++;        }        return true;      }    }    return false;  }

  Date:hfaHTML5中文学习网 - HTML5先行者学习网

public boolean equals(Object obj) {    return obj instanceof Date && getTime() == ((Date) obj).getTime();  }

  也就是说在这些时候重写了Object类的equals()方法用于比较两个对象实际的内容而不再是地址了,当然肯定不只是这些,这里只是举出了几个比较常见的java原生类重写Object类的equals()方法的情况。hfaHTML5中文学习网 - HTML5先行者学习网

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!hfaHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助