对象相等比较:深入equals方法

2016-02-19 19:00 7 1 收藏

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享对象相等比较:深入equals方法,希望可以对大家能有小小的帮助。

【 tulaoshi.com - 编程语言 】

  equals方法的重要性毋须多言,只要你想比较的两个对象不愿是同一对象,你就应该实现
  equals方法,让对象用你认为相等的条件来进行比较.

  下面的内容只是API的规范,没有什么太高深的意义,但我之所以最先把它列在这儿,是因为
  这些规范在事实中并不是真正能保证得到实现.

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  1.对于任何引用类型, o.equals(o) == true成立.
  2.假如 o.equals(o1) == true 成立,那么o1.equals(o)==true也一定要成立.
  3.假如 o.equals(o1) == true 成立且  o.equals(o2) == true 成立,那么
    o1.equals(o2) == true 也成立.
  4.假如第一次调用o.equals(o1) == true成立再o和o1没有改变的情况下以后的任何次调用
  都成立.
  5.o.equals(null) == true 任何时间都不成立.

  以上几条规则并不是最完整的表述,具体的请参见API文档.

  对于Object类,它提供了一个最最严密的实现,那就是只有是同一对象是,equals方法才返回
  true,也就是人们常说的引用比较而不是值比较.这个实现严密得已经没有什么实际的意义,
  所以在具体子类(相对于Object来说)中,假如我们要进行对象的值比较,就必须实现自己的
  equals方法.

  先来看一下以下这段程序:

  
      public boolean equals(Object obj)
      {
          if (obj == null) return false;
          if (!(obj instanceof FieldPosition))
              return false;
          FieldPosition other = (FieldPosition) obj;
          if (attribute == null) {
              if (other.attribute != null) {
                  return false;
              }
          }
          else if (!attribute.equals(other.attribute)) {
              return false;
          }
          return (beginIndex == other.beginIndex
              && endIndex == other.endIndex
              && field == other.field);
      }

   这是JDK中Java.text.FieldPosition的标准实现,似乎没有什么可说的.

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

   我信相大多数或绝大多数程序员认为,这是正确的合法的equals实现.究竟它是JDK的API实现啊.

   还是让我们以事实来说话吧:

  package debug;

  import java.text.*;

  public class Test {
    public static void main(String[] args) {
      FieldPosition fp = new FieldPosition(10);
      FieldPosition fp1 = new MyTest(10);
      System.out.println(fp.equals(fp1));
      System.out.println(fp1.equals(fp));
    }
  }
  class MyTest extends FieldPosition{
    int x = 10;
    public MyTest(int x){
      super(x);
      this.x = x;
    }
    public boolean equals(Object o){
      if(o==null) return false;
      if(!(o instanceof MyTest )) return false;
      return ((MyTest)o).x == this.x;
  

来源:http://www.tulaoshi.com/n/20160219/1619785.html

延伸阅读
标签: ASP
  三、Global.asa ASP的Application和Session对象体现了其他ASP内置对象所没有的特征--事件。每一个访客访问服务器时都会触发一个OnStart事件(第一个访客会同时触发Application和Session的OnStart事件,但Application先于Session),每个访客的会话结束时都会触发一个OnEnd事件(最后一个访客会话结束时会同时触发Application和Sess...
标签: Web开发
用ASP编写虚拟社区、网上购物等程序时,Application和Session对象具有举足轻重的作用,能够灵活合理地运用这两个对象是提高程序质量的关键。下面让笔者根据自己在这方面的经验,向大家深入介绍一下ASP的这两个内建对象。 一、Application对象的成员概述 Application对象成员包括Application对象的集合、方法和事件。 ⒈Applic...
FrameLayout (帧布局), LinearLayout (线性布局), AbsoluteLayout (绝对布局), RelativeLayout (相对布局), TableLayout (表格布局) FrameLayout: FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 ,比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能...
abort 方法 作 用 abort 方法取消一个进行中的异步下载 基本语法 xmlDocument.abort();说 明 如果这个方法在异步下载时被呼叫,所有的解析动作会停止,而且在内存中的文件会被释放。范 例xmlDocumentAppendChild 方法 作 用 加上一个节点当作指定节点最后的子节点。 基本语法 xmlDocumentNode.appendChild(newChild);说 明 newChild 是附加子...
Ondataavailable 事件 作 用 此事件会在XML 文件有效时被触发。 基本语法 此一事件有下面三种处理方式. Inline: ;. Event property:object.ondataavailable = handler;. Named script: ; 说 明 ondataavailable 事件只要一获得有效的数据就会被触发。这项技术并未说明在这个文件中有多少数据是有效的。范 例xmlDoc.ondataavailable = ...

经验教程

130

收藏

29
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部