以前看面试题的时候,总是遇到equals和“==”的区别这样的问题,之前都是直接背下来的应付面试笔试什么的,今天看了一下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;
}
在看这段代码的时候,有些地方不太明白,所以有些自测了一下,还有些百度了一下。
先说一下这个this:
这个this指代的是这个类,对,String类,如果在这个this后面加个点,能点出这个类中的方法和Object类的一些方法
再说一下这个instanceof:
instanceof 是一个简单的二元操作符, 它是用来判断一个对象是否是一个类实例的
boolean b1 = "Sting" instanceof Object;
b1为true 因为String是Object的子类
boolean b2 = new String() instanceof String;
b2为true
boolean b3 = new Object() instanceof String;
b3为false Object是父类
boolean b4 = 'A' instanceof Character;
编译不通过 ‘A’在此处视为基本数据类型char,instanceof操作符只能用作对象的判断
boolean b5 = null instanceof String;
b5为false 这是instanceof 特 有 的 规 则 : 若左操作数为null, 结果就直接返回false, 不再运算右操作数是什么类。
boolean b6 = (String)null instanceof String;
b6为false 即使类型转换还是个 null
boolean b7 = new Date() instanceof String;
编译不通过 instanceof 操作符的左右操作数必须有继承或实现关系,否则编译出错
boolean b8 = new GenericClass<String>().isDateInstance("");
class GenericClass<T>{
public boolean isDateInstance(T t){
return t instanceof Date;
}
编译通过,b8为false 因为用了泛型,所以字节码的时候T就是Object类型啦,此处t instanceof Date等价于Object instance of Date。
这里我就直接引用网上的了,总之,instanceof就是用来判断前面一个对象是不是后面对象的一个实例。
那么,这段源码的意思就简单了:
首先,if (anObject instanceof String)。
equals比较的是两个String类型的参数,如果参数不是String类型的,返回false
然后,equals也是用“==”来实现的,其实就是把需要比较的两个字符串转化成了字符数组,然后一个个的比较字符是否相等。
最后,还有一句代码:
if (this == anObject) {
return true;
}
这句代码是比较两个对象是否相等
总结一下:
1.equals比较的是两个对象,两个字符串是否相等,“==”比较的是两个变量在内存的地址是否是相同的
2.equals的底层也是用“==”来实现的