`
rmeebh
  • 浏览: 50110 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Equals 和== 的区别

阅读更多
qauls 与 = =之异同
  1)比较方式角度:

  ==是面向过程的操作符;equals是面向对象的操作符

  ==不属于任何类,equals则是任何类(在Java中)的一个方法;

  我们可以1)Primitive1 (基本类型)== Primitive2(基本类型);

  2)Object Reference1(对象引用)== Object Reference2(对象引用)

  3)Object Reference1 (对象引用).equals(Object Reference2 (对象引用))

  这三种比较

  但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));

  对于基本类型,没有面向对象中发送消息一说,自然也不会有

  方法成员。

  2)比较目的角度:

  1) 如果要比较两个基本类型是否相等,请用==;

  2) 如果要比较两个对象引用是否相等,请用==;

  3) 如果要比较两个对象(逻辑上)是否一致,请用equals;

  对两个对象(逻辑上)是否一致的阐释:

  有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由 equals()来实现 。

  这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;

  有人会有看法:“取决于人类的看法”太过宽泛和不严肃,如果某人要两件

  风牛马不相及的事物也相等,equals是否也能作出这样的比较呢?我们说可以的

  下面这个例子说明了这一点:

class Horse {
  String Type;
  int Legs;
  //相等的标准:腿的数目相等

  public boolean equals(Object o){
      if(this.Legs==((Cattle)o).Legs){
          return true;
      }
      return false;
  }
  public Horse(String Type,int legs){
          this.Type=Type;
          this.Legs=legs;
      }
  }
  class Cattle
  {
      String Type;
      int Legs;
      //相等的标准:腿的数目相等

      public Cattle(String Type,int legs){
          this.Type=Type;
          this.Legs=legs;
        }
      public boolean equals(Object o){
          if(this.Legs==((Horse)o).Legs){
              return true;
            }  
          return false;
      }
  }

  public class EqualsTest{
      public static void main(String[] args){

          Cattle c=new Cattle("I'm the Cattle",4);
          Horse h=new Horse("I'm the Horse",4);
          if(c.equals(h)){
              System.out.println(c.Type);
              System.out.println(h.Type);
              System.out.println("Cattle Equals Horse");
          }
      }
    }


输出结果:"I'm the Cattle"

  "I'm the Horse"

  "Cattle Equals Horse"

  您瞧瞧:牛果真等于了马,为何相等?因为我们定义的相等标准是:腿的数目相等;您会说:“这太滑稽”,是滑稽,可这是人类的看法,计算机可没有滑稽的概念,当然也没有“不滑稽”的概念,我们定义了什么相等标准,他就踏踏实实的为我们实现了;

  所以说:相等标准(即需求)一定要定好,否则,滑稽的事可就多了

  第三节:equals()缘起:

  equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身);而equals()是Object的方法之一。

  我们不妨观察一下Object中equals()的source code

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


注意 “return (this == obj)”

  this与obj都是对象引用,而不是对象本身。所以equals()的缺省实现就是比较

  对象引用是否一致;为何要如此实现呢? 前面我们说过:对象是否相等,是由我们的需求决定的,世界上的类千奇百怪(当然,这些类都是我们根据模拟现实世界而创造的),虽然Object是他们共同的祖先,可他又怎能知道他的子孙类比较相等的标准呢?但是他明白,任何一个对象,自己总是等于自己的,何谓“自己总是等于自己”呢,又如何判断“自己总是等于自己”呢?一个对象在内存中只有一份,但他的引用却可以有无穷多个,“对象自己的引用1=对象自己的引用2”,不就能判断“自己总是等于自己”吗?所以缺省实现实现自然也就是

  “return (this == obj)”;

  而到了我们自己编写的类,对象相等的标准由我们确立,于是就不可避免的要覆写

  继承而来的public boolean equals(Object obj);

  如果您有过编覆写过equals()的经验(没有过也不要紧),请您思考一个问题:

  “两个对象(逻辑上)是否一致”实际上是比较什么?没错,或许您已脱口而出:

  就是对象的属性(即field,或称数据成员)的比较。方法是不可比较的哦。(这个问题是不是有些弱智呢?哈哈)

  第四节:对一个推论的思考

  推论如下:一言以蔽之:欲比较栈中数据是否相等,请用= =;

  欲比较堆中数据是否相等,请用equals;

  因为(根)基本类型,(根)对象引用都在栈中; 而对象本身在堆中;

  这句话又对又不对,问题出在哪,就是“数据”二字,先看栈中,数据或为基本类型,或为对象引用,用==比较当然没错;但是堆中呢?对象不是堆中吗?不是应该用equals比较吗?可是,我们比较的是堆中“数据”,堆中有对象,对象由什么构成呢?可能是对象引用,可能是基本类型,或两者兼而有之。如果我们要比较他们,该用什么呢,用”equals()”?不对吧,只能是”= =”!所以正确的结论是:欲比较栈中数据是否相等,请用= =; 欲比较堆中数据是否相等,请用equals;

  因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含); 而对象本身在堆中。
分享到:
评论
1 楼 redcoatjk 2011-01-05  
例子写的不错

相关推荐

    java中equals和==的区别

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...

    java中equals和==的区别.doc

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...

    java中equals和==的区别.docx

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个常用的操作符,经常用于比较对象或变量的值。然而,许多开发者不知道它们之间的区别,或者误用它们,导致程序出错。下面我们将详细解释 equals 和 == 的...

    Java基础复习(内附String中equals与==区别的分析)

    本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...

    【Java面试题】equals与==的区别

    【Java面试题】equals与==的区别

    Java 中equals和==的区别.doc

    Java 中equals和==的区别

    equals与==之间的区别

    在Java编程语言中,`equals`方法与`==`操作符是进行对象比较时最常用的两种方式,但它们之间存在着显著的区别。理解这些差异对于正确地处理对象比较至关重要。 ### `==` 操作符 `==`操作符主要用于比较两个基本...

    java 资料 equals 与== 的区别

    Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...

    java中equals和==的区别-5页.pdf

    java中equals和==的区别-5页.pdf

    java中equals和==的区别.

    理解`equals()`和`==`的区别对于避免常见的错误至关重要,比如在比较自定义对象时误用`==`而导致预期结果出错。当比较自定义对象时,通常应该重写`equals()`方法,以便比较对象的属性或状态,而不是仅仅比较引用。...

    java中equals()函数的用法 equals和==的区别

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别对于编写出正确、健壮的代码至关重要。 首先,`==`运算符用于基本类型(如int, char, boolean)的比较,...

    java中equals和==的区别.pdf

    Java中equals和==的区别 Java是一门面向对象的编程语言,它提供了多种运算符和方法来比较对象和变量。在Java中,比较两个对象是否相等时,经常使用到的运算符有"=="和"equals"。虽然两者都可以用于比较,但它们有着...

    java equals和==的区别详解

    在Java编程语言中,`equals()` 和 `==` 运算符在比较对象时有着显著的不同。理解这两者的区别对于编写高效、可靠的代码至关重要。以下是它们的详细解释: 1. **`==` 运算符**: `==` 在Java中主要用于比较基本类型...

Global site tag (gtag.js) - Google Analytics