文章目录
java ==和 equals
“==” 和 equals也是高频面试的问题
所以我就记录下来,和大家分享分享啦,喜欢的可以点个赞哦
1. ==
1."==“在基本数据类型中使用是判断值是否相同
2.”=="在引用数据类型中是判断引用地址是否相等
1.1案例
1.1.1基本数据类型使用 “==”
int a = 10;
int b = 20;
int c = a;
// a 和 b 都是基本数据类型,所以比较的是值是否相同
System.out.println(a == b);
System.out.println(a == c);
1.1.2 引用数据类型使用“==”
我们可以看到 b 对象和 a 对象为 “true”,因为 b 对象指向了 a 对象,
a 和 c 比为什么为 “false” 呢? 因为 c 对象是再次初始化的,已经不再是同一个地址
~~我们可以把他们的一个地址输出来看一下(并不是真正的对象地址)
可以看到 a 和 b 的地址是一致的,c 的就和 a 不是一致,所以就为“false”
2.equals
equals 是 object 中的方法,默认情况是判断引用地址是否相等,一般重写 equals,比较对象的值是否相等
2.1 equals 原码
下面就是 Object 中的 equals 原码,可以看到就是判断两个对象地址是否相等
2.2 equals 举例
A a = new A("Jack",12,"Java"); // 初始化对象
A b = a; // b 指向 a 对象
A c = new A("Jack",12,"Java"); // 初始化对象
System.out.println(a.equals(b));
System.out.println(c.equals(a));
我们可以看到使用 equals 也是和 “==”结果是一样,如果还不明白可以看上面的原码
2.3 为什么字符串没有重写 equals 方法,依然比较值是否相等?
因为字符串都是 String 的子类,String 类已经重写过 equals,我们可以看一下 String 中的 equals
所以在字符串比较的时候就是比较值是否相等
3.重写 equals
重写 equals 方法后,就是比较两个对象的值是否相等
// 重写 equals
public boolean equals(Object obj) {
// 如果两个对象是同一个地址
if (this == obj) { // this:哪个对象调用,this 就指向哪个对象
return true;
}
// 如果不是同一个对象
if (! (obj instanceof A)) {
return false;
}
// 比较值是否相等
A a = (A)(obj); // 向下转型,否则无法调用子类的方法
return this.name.equals(a.getName()) && this.age == a.getAge() && this.job.equals(a.getJob());
}
3.1 重写 equals 后的效果
我们可以看到,重写之后判断的就是值是否相等
总结
1."=="在基本数据类型就是判断值是否相同
2.在引用数据类型就是判断地址是否相同
3.equals 没有重写默认调用的是 Object 中的,判断地址是否相等
4.重写equals 之后判断对象值是否相等