eqauls 与 = =之异同

转载 2007年09月12日 11:25:00

第一节 eqauls = =之异同

1)比较方式角度:

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

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

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

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

         3Object 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的方法之一。

        我们不妨观察一下Objectequals()source code:

         public boolean equals(Object obj) {

                      return (this == obj);

          }

        注意 “return (this == obj)”

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

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

        “return (this == obj)”

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

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

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

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

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

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

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

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

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

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

因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含); 而对象本身在堆中。

 

【学习笔记】Java中eqauls的原理

Java中eqauls的原理 之前想查查==和equals的区别。老生长谈的东西了,网上查到的资料也有很多,但总有些不太明白,今天索性自己来一探究竟。 总结起来一句话:==只比较【原始类型...
  • zhyl8157121
  • zhyl8157121
  • 2013年11月09日 19:49
  • 1645

复变函数第三章-复变函数的积分

复变函数的积分 1 概念 2 柯西-古萨基本定理 3 复合闭路定理 4 原函数与不定积分 5 柯西积分公式 6 解析函数的高阶导数 7 调和函数 3 复变函数的积分3.1 概念闭曲线积分\oint_\...
  • Ga4ra
  • Ga4ra
  • 2017年11月26日 22:30
  • 101

抽象类和接口有什么异同

接口和抽象类的相同点: 1.都不能被实例化 2.接口的实现类或者抽象类的子类都只有实现了接口或者抽象类中的方法后才能被实例化。 接口和抽象类的不同点: 1.接口只有定义,其方法不能在接...
  • XiaopinOo
  • XiaopinOo
  • 2017年09月07日 18:41
  • 167

瀑布式来开发和敏捷开发的异同

敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把...
  • MaggieMiaoMiao
  • MaggieMiaoMiao
  • 2015年06月01日 16:24
  • 706

循环和递归的异同

算法其实还是很有意思的 慢慢研究 收获会很大 简单的来讲解一下 循环与递归的异同 1.相同: 递归与循环都是解决 重复操作的机制 2.不同      就算法效率而言,递归算...
  • u012701023
  • u012701023
  • 2015年09月30日 02:00
  • 409

在dotnet中类(class)与结构(struct)的异同?

Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。 Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。加分的回答:Int32、Boolean等都属于结构体。...
  • X_X_OO
  • X_X_OO
  • 2016年09月13日 19:45
  • 763

用C代码来玩“藕式结构”中的本地过程调用和远程过程调用

在前面的文章中, 我聊了“藕式结构”, 在本文中, 我就不再聊藕了, 而是来玩代码。好久没有在Windows上搞代码了, 现在来玩一下。 先写本地过程调用: #include #include ...
  • stpeace
  • stpeace
  • 2015年11月05日 23:51
  • 2503

lua语法学习1

--   -- run  --   local sceneGame = cc.Scene:create()  --   sceneGame:addChild(createLayerFarm()) ...
  • dugaoda
  • dugaoda
  • 2015年02月11日 18:47
  • 247

重定向和转发的异同点

重定向:就是浏览器解析到一个状态码,然后又重新请求一次Location 转发:本来请求的是A,但看的是B的内容 共同点;浏览器呈现给我们的都是别的地址的内容 不同点: 重定向:地址发生变化 转发:地址...
  • qq_39168008
  • qq_39168008
  • 2017年07月12日 21:14
  • 286

管道和FIFO

管道和FIFO 1.1    管道和FIFO简介          管道是最初的unixIPC形式,广义的管道包含无名管道(狭义的管道)和有名管道(FIFO)          无名管道采用pi...
  • CODINGCS
  • CODINGCS
  • 2015年09月26日 21:36
  • 348
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:eqauls 与 = =之异同
举报原因:
原因补充:

(最多只允许输入30个字)