面试题:==和equals的区别?
- ==
==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址 - equals
object中默认也是采用== 比较。通常会重写。如果没有重写,通常equals和==也是差不多的
java
public boolean equals(Object obj) {
return (this == obj);
}
例如String的重写
java
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
其中StringUTF16的比较方法如下:
java
```java
@HotSpotIntrinsicCandidate
public static boolean equals(byte[] value, byte[] other) {
if (value.length == other.length) {
int len = value.length >> 1;
for (int i = 0; i < len; i++) {
if (getChar(value, i) != getChar(other, i)) {
return false;
}
}
return true;
}
return false;
}
实际本质上重写的是比较字符串里面每个字符是否相等
- 如果长度不相等,直接返回false
- 如果长度相等,就逐个比较字符,一旦就不相等,返回false,如果所有都相等返回true
- 案例测试
