深入equals方法

2016-02-19 14:15 0 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐深入equals方法,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

  深入equals方法

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

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

  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方法.

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

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

  
      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的标准实现,似乎没有什么可说的.

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

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

  package debug;

  import java.text.*;

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

  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;
  

来源:https://www.tulaoshi.com/n/20160219/1606560.html

延伸阅读
JAVA关键字final用于修饰数据、方法或类,通常意味着“无法改变的”,既数据不能改变,方法不能覆盖,类不能继承。一般采用final有两种原因:设计和效率。而随着JAVA版本的更新,一些效率上的问题可以交由编译器和JVM处理。因此,采用final来解决效率问题就显得不是那么重要了。 Final修饰符大多运用于基本数据类型(primitive)域或者不可变...
  前面的文章我们讲述了 LILO 的配置,本文我们将深入底层来讲述LILO 的技术细节,也将告诉读者怎样 去掉LILO 以及重新安装LILO。 前文我们讲述了LILO 配置的灵活性,本文我们将讲述LILO 的内部技术细节以及启动时的主要操作及其功 能,以帮助我们调整LILO 的安装。LILO 最大的好处就是它独立...
Java.awt.Robot 类用于控制鼠标和键盘。一旦你得到这种控制,你能够通过你的Java代码做与鼠标和键盘任何类型的操作。这个类通常用于自动化测试。下面的代码样例将向您展示Robot类如何处理键盘事件。如果你运行此代码,并打开notepad,您将在notepad中看到HI CAOER.赶快试一试吧。 代码如下: import java.awt.AWTException; import java.awt.R...
标签: Web开发
在网页设计中,用来定位内容的元素一般包括:表格和图层,其中表格是大家在网页的整体布局中它的使用应该是最广的,也最常看到的;相对来说图层则更灵活性,操作更方便。图层除了象表格一样可以设定背景,位置,自由移动,响应事件,控制显示外,还可以轻松建立三维效果,我们可以使网页中的对象在垂直方向互相重叠,再配合Timeline的应用...
标签: Web开发
上个星期写了一篇《控件 ViewState 属性的值保存去哪里了》,解释了Control.ViewState最终还是通过Control.SaveViewState和Control.LoadViewState这两个方法存取的。文章中有一句话可能会让大家感到疑惑的:“我们在OnInit之后使用this.ViewState[key]读写时该属性都为true”,其中“该属性”指StateItem.IsDirty。到底为什么IsDirty属性在...

经验教程

601

收藏

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