== 与 equals() 区别
形同点:
都是比较两个值是否相等。
不同点:
- ==
- 既可以比较基本数据类型也可以比较引用数据类型
- 比较基本数据类型时比较的时具体的数值
- 比较引用数据类型时比较的时两个引用数据类型在堆内存中的地址值
- equals()
- 只能比较引用数据类型(包括包装类)
- 比较包装类时会将包装类自动拆箱然后比较具体的数值【例如Integer,见:图1-1】
- 比较封装的对象时,会先比较两个对象的地址值是否相同(判断是否时同一个对象),如果不是,则比对每个成员变量的具体数值。在封装对象时可以重写父类Object中的equals()方法,就可以看到。【见:图1-2】
- 例如 String 则会将比较的字符串和当前字符串分别转换成字符数组,然后遍历比较每个字符是否相等【见:图1-3】
图例
图 1-1
public class Demo{
public void a(){
Integer a = 1;
Integer b = 2;
// 比较两个包装类
if (a.equals(b)){
System.out.println("包装类型比较");
}
}
}
// 源码类
public final class Integer extends Number implements Comparable<Integer> {
// 当前包装类
private final int value;
// Integer 源码
public boolean equals(Object obj) {
// instanceof 判断当前传入的对象是否是 Integer 类型
if (obj instanceof Integer) {
// 进行数据拆箱然后进行比较
return value == ((Integer)obj).intValue();
}
return false;
}
}
图 1-2
public class Demo{
public void a(){
// 创建两个对象
Express express = new Express();
Express express1 = new Express();
// 进行对象比较
if (express.equals(express1)){
System.out.println("封装对象比较");
}
}
}
public class Express{
/** 快递单号 */
private String number;
/** 快递公司 */
private String company;
/** 取件码 */
private Integer code;
// 重写父类 Object 中的equals()方法
@Override
public boolean equals(Object o) {
// 判断两个对象是否是同一个对象(堆内存地址值是否相同)
if (this == o) return true;
// 当前对象为null 或 判断两个对象的包地址不相同 getClass() 获取到当前类的包地址
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
// 对象中的属性值是否相同
return Objects.equals(number, express.number) &&
Objects.equals(company, express.company) &&
Objects.equals(code, express.code);
}
}
图 1-3
public class Demo{
public void a(){
String a = "a";
String b = "b";
if (a.equals(b)){
System.out.println("String 类型进行比较");
}
}
}
// 源码比较
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
public boolean equals(Object anObject) {
// 先判断当前俩个对象是否相同
if (this == anObject) {
return true;
}
// 判断当前传入的对象是否是 String 类型
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;
}
}