误区1-java中equals与==比较

  近来编程学习过程中,发现某一些常识性的知识或问题,因我们治学态度不严谨或想当然的学习方式,而常常产生错误的理解。特将工作学习过程中,发现或遇到的一些问题记录如下。

  误区:equals比较内容,==比较引用。  

  java中,“equals比较内容,==比较引用”的认识,非常普遍。然而,只需自行测试即可发现该观点的不正确。

public static void main(String[] args) {
    TestEquals testEquals = new TestEquals();
    testEquals.testFunc();
 }
 
private void testFunc() {
    class TestItem {
       int value;
       public TestItem(int i) {
          // TODO Auto-generated constructor stub
          value = i;
       }
   
     /*public boolean equals(Object item) {
        System.out.println("TestItem equals");
            return this.value == ((TestItem)item).value;
        }*/
  }
  
  TestItem item1 = new TestItem(1);
  TestItem item2 = new TestItem(1);
  testCompareFunc(item1, item2);
  
  Integer int1 = new Integer(1);
  Integer int2 = new Integer(1);
  testCompareFunc(int1, int2);
  
 }
 
 /**
  * 测试比较两个元素
  * @param <T>
  * @param item1
  * @param item2
  */
 public static <T> void testCompareFunc(T item1, T item2) {
    if ( item1.equals(item2) ) {
       System.out.println("item1.equals(item2)=true");
    } else {
     System.out.println("item1.equals(item2)=fale");
  }
  
    if ( item1 == item2 ) {
       System.out.println("item1 == item2=true");
    } else {
       System.out.println("item1 == item2=fale");
    }
  System.out.println("=============================================");
 }

上述测试代码,输出结果为:

item1.equals(item2)=fale
item1 == item2=fale
=============================================
item1.equals(item2)=true
item1 == item2=fale
=============================================

若打开TestItem的equals重载方法,则输出结果为:

TestItem equals
item1.equals(item2)=true
item1 == item2=fale
=============================================
item1.equals(item2)=true
item1 == item2=fale
=============================================

“==”比较的是一个对象的内存地址,即,是否是同一份内存数据,在java调试过程中,可通过观察对象的内存地址是否相等或直接查看对象产生的hashcode是否相等来进行判断。

而equals,作为Object类中可以被重载的函数,它的使用,只依赖于所使用的那个类是如何实现重写该方法的。根据需要,可以自行实现为比较对象内的内容值是否相同,如基本对象类型Integr,又可实现为直接比较对象的内存地址,甚至结合二者的比较形式,例如,String、Float等类型的实现,均为首先直接比较对象的内存地址,若不等,则再进行比较内容值,再行返回结果。因为java中所有的类都默认继承于Object,因此若某类没有自行重载该方法,则默认使用Object的equals方法,而Object的equals方法,是直接比较对象的内存地址。

 

因此,==比较引用,但equals的比较方式,取决于类是否重载该方法,若未重载,则与==的比较方式相同。

 

 

 

 

 

 

posted on 2011-02-22 22:04  大七  阅读(393)  评论(0)    收藏  举报

导航