参考答案
1. 基本概念区分
- == 是关系运算符,equals() 是方法,结果都返回布尔值。
- Object 的 == 和 equals() 比较的都是地址,作用相同。
2. 作用区分
2.1 ==
- 基本类型,比较值是否相等。
- 引用类型,比较内存地址值是否相等。
- 不能比较没有父子关系的两个对象。
2.2 equals()
- JDK 中的类一般已经重写了 equals(),比较的是内容
- 自定义类如果没有重写 equals(),将调用父类(默认 Object 类)的 equals() 方法,Object 的 equals() 比较使用了 this == obj
- 可以按照需求逻辑,重写对象的 equals() 方法,一般须重写 hashCode 方法,重写后的equals()方法一般都是比较两个对象的值,比如String类。
Object类equals()方法源码:
public boolean equals(Object obj) { return (this == obj); }
String类equals()方法源码:
public boolean equals(Object anObject) { if (this == anObject) { return true; } 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; }
3. 源码实例
示例1
int x = 10; int y = 10; String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(x == y); // true System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true
示例2
String str3 = "abc"; String str4 = "abc"; System.out.println(str3 == str4); // true
str3与str4相等的原因是用到了内存中的常量池,当运行到str3创建对象时,如果常量池中没有,就在常量池中创建一个对象”abc”,第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。
示例3
先定义学生Student类:
public class Student { private int age; public Student(int age) { this.age = age; } }
再创建两个Student实例来比较:
Student student1 = new Student(23); Student student2 = new Student(23); System.out.println(student1.equals(student2)); // false
此时equals方法调用的是基类Object类的equals()方法,也就是==比较,所以返回false。
然后我们重写下equals()方法,只要两个学生的年龄相同,就认为是同一个学生。
public class Student { private int age; public Student(int age) { this.age = age; } @Override public boolean equals(Object obj) { Student student = (Student) obj; return this.age == student.age; } }
再来比较下刚才的两个实例,返回true。
Student student1 = new Student(23); Student student2 = new Student(23); System.out.println(student1.equals(student2)); // true
基础知识要牢记,只有根基牢固,才能建造更高的大厦。
以上,是Java面试题【==和equals的区别是什么】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—