zoukankan      html  css  js  c++  java
  • equals与”==”的区别

    本文由 ImportNew - 刘志军 翻译自 Javarevisited。如需转载本文,请先参见文章末尾处的转载要求。

    equals()和“==”操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法后者是操作符。由于java不支持操作符重载(overloading),“==”的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden )。另一个需要注意的不同点是“==”习惯用于原生(primitive)类型之间的比较,而equals()仅用于对象之间的比较。同时初学者奋力地想找到什么时候使用等号操作“==”,什么时候使用equals方法。这篇教程中你将将看到equals()方法和“==”操作是如果工作的、他们之间有什么不同、什么时候用“==”、什么时候使用equals()方法。

    “==”等号操作是什么

    “==”或等号操作在Java编程语言中是一个二元操作符,用于比较原生类型和对象。就原生类型如boolean、int、float来说,使用“==”来比较两者,这个很好掌握。但是在比较对象的时候,就会与equals()造成困惑。“==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指向同一个对象)时,“==”操作将返回true,否则返回false。

    什么是equals方法

    equals()方法定义在Object类里面,根据具体的业务逻辑来定义该方法,用于检查两个对象的相等性。例如:两个Employees被认为是相等的如果他们有相同的empId的话,你可以在你自己的domain对象中重写equals方法用于比较哪两个对象相等。equals与hashcode是有契约的(无论什么时候你重写了equals方法,你同样要重写hashcode()方法),默认的equals方法实现是与“==”操作一样的,基于业务需求重写equals方法是最好的实践之一,同样equals与compareTo保持一致也不足为奇,以至于存储对象在Treemap或treeset集合中时,将使用compareTo方法检查相等性,行为是一致的。

    ==与equals方法的区别

    ==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。

    字符串的==和equals对比

    字符串的比较是一个常见的情景,因为java.lang.String类重写了equals方法,它返回true如果两个字符串对象包含有相同的内容,但是==只有他们的引用地址相同时才返回true,下面这个例子就是通过==和equals方法分别比较两个字符串。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    String personalLoan = newString("cheap personal loans");
    String homeLoan = newString("cheap personal loans");
     
    //since two strings are different object result should be false
    booleanresult = personalLoan == homeLoan;
    System.out.println("Comparing two strings with == operator: " + result);
     
    //since strings contains same content , equals() should return true
    result = personalLoan.equals(homeLoan);
    System.out.println("Comparing two Strings with same content using equals method: " + result);
     
    homeLoan = personalLoan;
    //since both homeLoan and personalLoand reference variable are pointing to same object
    //"==" should return true
    result = (personalLoan == homeLoan);
    System.out.println("Comparing two reference pointing to same String with == operator: " + result);
     
    Output:
    Comparing two strings with == operator: false
    Comparing two Strings with same content using equals method: true
    Comparing two reference pointing to same String with == operator: true

    ==与equals在对象之间的对比
    另一中情景是:当你对比两个对象时,在选择==和equals方法中很容易困惑,当你比较的两个引用指向的对象是Object的类型的时候,那么你看到的结果和==是一致的,因为默认的equals方法实现仅仅比较的内存地址。如果两个引用变量完全指向的是同一个对象的话就返回true,下面这个例子是equals和==方法操作比较的是两个对象。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Object obj1 = newObject();
    Object obj2 = newObject();
     
    // == should return false
    result = (obj1==obj2);
    System.out.println("Comparing two different Objects with == operator: " + result);
     
    //equals should return false because obj1 and obj2 are different
    result = obj1.equals(obj2);
    System.out.println("Comparing two different Objects with equals() method: " + result);
     
    // "==" should return true because both obj1 and obj2 points same object
    obj1=obj2;
    result = (obj1==obj2);
    System.out.println("Comparing two reference pointing to same Object with == operator: " + result);
     
    Output:
    Comparing two different Objects with == operator: false
    Comparing two different Objects with equals() method: false
    Comparing two reference pointing to same Object with == operator: true

    总结:

    1. 使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。
    2. ==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现
    3. 字符串的对比使用equals()代替==操作符

    以上就是关于equals方法和==操作符的区别,其主要的不同是一个是操作符一个是方法,==用于对比原生类型而equals()方法比较对象的相等性。

    原文链接: Javarevisited 翻译: ImportNew.com 刘志军
    译文链接: http://www.importnew.com/6804.html

  • 相关阅读:
    1393 0和1相等串 鸽笼原理 || 化简dp公式
    C. Coin Troubles 有依赖的背包 + 完全背包变形
    D. PolandBall and Polygon BIT + 欧拉公式
    51NOD 1639 绑鞋带 数学
    D. Fedor and coupons 二分暴力
    hdu 4104 Discount
    bnu 51640 Training Plan DP
    hdu 5745 La Vie en rose DP + bitset优化
    hdu 5036 Explosion bitset优化floyd
    1354 选数字 DP背包 + 数学剪枝
  • 原文地址:https://www.cnblogs.com/daichangya/p/12958948.html
Copyright © 2011-2022 走看看