equals方法与==的区别

 

1、Object类中的equals方法

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

显而易见,自定义的没有重写equals方法的类在使用equals方法时与==没什么差别

 

2、预定义类中的equals方法

// String类的equals方法
public
boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }

预定义类中的equals方法大多都有自己的算法,如上是String类重写后的equals方法,不仅包含了==的效果,还做了其他的操作,实现了比较字符的效果

 

 拓展

 

一、equals方法应具有以下特性

1.自反性:对于任何非空引用x,x.equals(x)应该返回true。

2.对称性:对于任何引用x和y,当且仅当y.equals(x)返回true时,x.equals(y)返回true。

3.传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true。

4.一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果。

5.对于任意非空引用x,x.equals(null)应该返回false。

 

二、instanceof关键字

如果用伪代码描述:

boolean result;
if (obj == null) {
  result = false;
} else {
  try {
      T temp = (T) obj; // checkcast
      result = true;
  } catch (ClassCastException e) {
      result = false;
  }
}
参考链接:https://www.zhihu.com/question/21574535

例如 if( obj  instanceof  T )

如果obj不为空,并且转换T类型不抛异常,则结果为true,否则为false

 

三、引用类型的强制转换

子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换,并且他们之间的强制类型转换是有条件的。

Father father = new Son();
Son son = (Son)father;

如果父类引用的是子类对象,则可以成功强制转换

Father father = new  Father();
Son son = (Son) father;

如果父类引用的是他本身或者其他子类,就会报错

参考链接:https://www.cnblogs.com/chenssy/p/3393160.html

 

posted @ 2021-12-28 22:46  骑着上帝去流浪t  阅读(55)  评论(0)    收藏  举报