== 和 equals 的区别是什么?
Java 基础面试题发布于
一、== 的作用
== 是 Java 的运算符,它的比较规则取决于两边的类型:
- 基本数据类型(byte、short、int、long、float、double、char、boolean):比较的是字面值是否相等。
- 引用数据类型:比较的是两个引用是否指向堆中的同一个对象(即内存地址是否相同)。
int a = 10;
int b = 10;
System.out.println(a == b); // true,基本类型比较值
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false,两个不同对象
二、equals 的作用
equals 是 Object 类定义的方法,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看到,Object 的默认实现仍然是用 == 比较地址。但很多类(典型如 String、Integer)重写了 equals,改为比较内容:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2)); // true,String 重写后比较内容
三、总结
| 对比项 | == | equals |
|---|---|---|
| 基本类型 | 比较值 | 不适用 |
| 引用类型 | 比较内存地址 | 默认比较地址,重写后可比较内容 |
| 是否可重写 | 运算符,不可重写 | 方法,可以按业务规则重写 |
小提示:重写
equals时务必同时重写hashCode,否则在 HashMap、HashSet 等基于哈希的集合中会出现行为异常。