深入【Java】底层细节知识点(4)equals()和==的区别
- UID
- 1066743
|
深入【Java】底层细节知识点(4)equals()和==的区别
五、eq
uals()和==的区别
他们最大的区别就是一个是方法,一个是关系操作符。
Object类中的equals方法源码:
public boolean equals(Object obj) { return this == obj; }可见它直接比较的对象本身。
String类中的equals方法源码(重写Object中的):
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 != v2) return false; i++; } return true; } } return false;}上面的equals比较当中,都运用到了“==”,这就说明,equals(不管哪个类中的)是==的扩展。
引用《java编程思想》中的原话:
关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系
总结:
- 当==比较基本数据类型的时候,就是比较他们本身的值。
- 而==比较引用数据类型的时候, 就是比较他们在内存的地址
- equals用来比较引用数据类型一般都要重写该方法。例如String类就重写了这个方法,
- 如果没有重写equals就直接比较,就是比较他们的内存地址
- equals不能用于基本数据类型
上面的str中存储的并不是“a”,而是它所指向的对象的地址。所以将他赋值给str2,比较他俩时返回的就是true
上面的Student类并没有重写equals方法,结果位false
|
|
|
|
|
|