zoukankan      html  css  js  c++  java
  • 转! java 中“==” 与“ .equals ”比较

    在java程序设计中,经常需要比较两个变量值是否相等。例如
    1、简单数据类型比较
    a = 10;
    b = 10;
    if(a == b){
    //写要执行的代码
    }
    2、引用数据类型比较
    ClassA a = new ClassA("abc");
    ClassB b = new ClassB("abc");
    if(a == b){
    //写要执行的代码
    }
    显然在例1中 a == b的值为true,例2中a == b值为false
    你应该有一些java基础吧,下面我用int类型和它的封装类Integer来说明简单类型和封装类型进行比较时的区别:
    ==和equals()的用法
    先看一段代码:
    public class TestEqual{
    public static void main(String [ ] args){
    //简单类型比较
    int a = 100;
    int b = 100;

    System.out.println("a == b?" + (a == b));
    //引用类型比较
    Integer c = new Integer(100);
    Integer d = new Integer(100);

    System.out.println("c == d?" + (c == d)); 
    }
    }
    运行该程序,会打印出以下信息:
    a == b? true
    c == b? false
    可以看出,在引用类型比较中,虽然用了同一个参数“100”来构造两个变量,但他们仍然不同。
    why??
    要知道,对于这两个引用类型变量c和d,他们指向的是两个不同的对象(只不过两个对象的值都是100),因为是指向两个对象,所以比较这两个变量会得到false的值。
    注意啦,重要结论:
    对于引用类型变量,运算符“==”比较的是两个变量是否引用同一对象。
    *************************************************************************************************************
    那么如何比较对象的值是否相等呢?
    在java中提供了equals()方法用于比较对象的值。我们把上面引用类型部分的程序稍作修改:

    Integer c = new Interger(100);
    Integer d = new Interger(100);
    System.out.println("c equals d?" + (c.equals(d) ));

    运行后可得一个true,这是因为,方法equals()进行的是“深层比较”,他会去比较两个对象的值是否相等。

    如果你想多学一点,一定会问:“这个可爱的equals()方法是由谁来实现的呢?”
    我们知道,java中所有类的父类是Object类,在Object中,已经定义了一个equals()方法,但是这个默认的equals()方法实际上也只是测试两个变量引用是否指向同一对象(即与那个可爱的 == 功能一样)。所以它并不一定能得到你所期望的效果。所以我们还经常需要自己将定义的类(就是上面的TestEqual)中的equals()进行覆盖。像Integer封装类就已经覆盖了Object中的equals()方法,直接可以拿来比较引用类型c和d指向的对象的值。

    好了,相信你一定耐心地看到了这里,我们来总结一下
    == 和equals()两种比较方法,在使用时要注意:
    1、如果测试两个简单类型的数值是否相等,则一定要用“==”来比较;
    2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较;
    3、如果需要比较两个引用变量是否指向同一对象,则使用“==”来进行比较;
    还有,对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。

  • 相关阅读:
    常见逻辑谬误
    4 WPF依赖属性
    11 WPF样式和行为
    17 WPF控件模板
    3 WPF布局
    4.6.3 The LRParsing Algorithm
    4.6 Introduction to LR Parsing: Simple LR
    19 WPF 数据绑定
    分布式系统部署、监控与进程管理的几重境界
    运维知识体系
  • 原文地址:https://www.cnblogs.com/wuyun-blog/p/4448902.html
Copyright © 2011-2022 走看看