笔友城堡 - 可定义的个人主页

前言

在Java面试中,经常被问==和 equals()的区别,两个都用于"比较",但含义完全不同。

简单记录一下,方便自己查阅。

正文

==运算符

基本类型
int a = 110;
int b = 110;
System.out.println(a == b); // true

比较的是“值”是否相等。

上面值都是为110,所以返回true

适用于基本类型的值比较

byte、short、int、long、float、double、char、boolean
引用类型

引用类型也就是类对象

String s1 = new String("biumall");
String s2 = new String("biumall");
System.out.println(s1 == s2); // false

比较的是“引用地址”,也就是是否指向同一个对象。

上面值虽然相同,但new创建了不同的对象,因此返回false

对比的是对象是否同一个,也就是引用的地址。

equals()方法

equals()来自 java.lang.Object:

public boolean equals(Object obj) {
    return (this == obj);
}

默认情况下,equals()等价于 ==

重写后的意义

大多数类会重写 equals(),用来比较“逻辑内容”。

String示例

String s1 = new String("biumall");
String s2 = new String("biumall");

System.out.println(s1.equals(s2)); // true

因为 String重写了 equals()

  • 先比较引用

  • 再比较字符内容

总结

对比点==equals()
本质运算符方法
基本类型比较值❌ 不能用于基本类型
引用类型比较地址通常比较内容(看实现)
是否可重写
默认行为比较地址==
经典示例解析
String 常量池
String a = "biumall";
String b = "biumall";

System.out.println(a == b);      // true
System.out.println(a.equals(b)); // true

原因:"biumall"放入字符串常量池,a 和 b 指向同一对象

new String()
String a = new String("biumall");
String b = new String("biumall");

System.out.println(a == b);      // false
System.out.println(a.equals(b)); // true  因为String重新了equals,先比较引用是否相同,然后比较引用中的内容是否相同
自定义类未重写 equals
class Person {
    int id;
}
Person p1 = new Person();
Person p2 = new Person();

System.out.println(p1 == p2);       // false
System.out.println(p1.equals(p2));  // false
正确重写 equals
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Person)) return false;
    Person person = (Person) o;
    //判断ID是否相等,如果相等表示
    return id == person.id;
}

重写 equals()必须同时重写 hashCode()

参考文章

AI

相关网址

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...