橙篇AI
橙篇AI - 用橙篇,就成了
在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()来自 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 a = "biumall"; String b = "biumall"; System.out.println(a == b); // true System.out.println(a.equals(b)); // true
原因:"biumall"放入字符串常量池,a 和 b 指向同一对象
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,先比较引用是否相同,然后比较引用中的内容是否相同
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
@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()