== 与 equals()
先看 == , 相信我们对 == 都不陌生 ,它用来比较值是否相等, 例:
int a = 1 ; double b = 1.0 ; System.out.println(a==b);
我们可以直接用 == 判断两个基本类型是否相等 ,这个结果为true
但是如果我们用 == 来判断二个引用类型 ,那么它比较的就是两个引用所引用对象的地址是否一致
例 :
public class Car { String color; public Car(String color){ this.color = color; } public static void main(String[] args) { Car car1 = new Car("白色"); Car car2 = new Car("白色"); Car car3 = car1; } }
这里 我们设计一个Car类,定义成员color ,提供有参构造方法
如果这里采用 == 比较的话, 显然 car1与car3是相等的,他们与car2都是不相等的
可以注意到car1 和 car2 的属性都是白色,虽然这两个对象是不一致的,但属性相同,能不能只去比较对象的属性,而不是像 == 一样比较这些对象的地址
那么我们自己去写一个方法来比较属性不就好了,所以equals()出现了
传统的equals()是定义在object类中的,object是所有类的父类,我们想让equals()怎么去比较,直接拿过来重写就行了
object类中定义的equals()是这样的(源码如下 : )
可以看到 它底层也是用了 == 来实现 ,但是我们可以去重写它,让它不这样去比
接着我们来看String类在比较这一方面是怎样去做的(jdk源码如下:)
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; }
String类重写了Object类中的equals()方法,这里比较的是内容
如果是我们自定义的类,想比较对象的内容,也是去重写equals()方法即可
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)