==和equals是非常常见的面试题。
共同点:都可以做比较,返回值都是boolean
区别:1.==是比较运算符,即可以比较的基本数据类型,也可以比较引用数据类型。
基本数据类型比较的是值,引用数据类型比较的是内存地址值
2.equals方法只能比较的是引用数据类型,equals方法在没有重写是比较的是地址值,
底层依赖的是==号,但是比较地址值没有意义,我们需要重写equals方法比较对象中的属性值
equals方法底层源码:
public boolean equals(Object obj) {
return (this == obj);
}
public class test {
public static void main(String[] args) {
Student s1 = new Student("张三", 23); //内存地址0x0011
Student s2 = new Student("张三", 23); //内存地址0x0022
System.out.println(s1==s2); //false ==比较地址值,s1和s2的内存地址不一样
System.out.println(s1.equals(s2)); //true equals比较的是属性值 是否长得一样
Student s3 = new Student("张三", 23); //内存地址0x0033
Student s4 = new Student("李四01", 23); //内存地址0x0044
System.out.println(s3==s4); //false
System.out.println(s3.equals(s4)); //false
}
}
Student类
public class Student {
private String name;
private int age;
public Student() { //无参构造 alt+shift+s 再加c
super();
}
public Student(String name, int age) { //有参构造方法 alt+shift+s 再加o
super();
this.name = name;
this.age = age;
}
//以下为get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "set [name=" + name + ", age=" + age + "]";
}
//重写的equals方法,也可以自动生成 alt+shift+s 在加上v
@Override
public boolean equals(Object obj) {
Student student =(Student)obj;
//多态,父类类型指向子类对象,无法调用子类特有的属性和方法,需要向下转型
//return this.name.equals(obj.name)&&this.age==obj.age;
return this.name.equals(student.name)&&this.age==student.age;
}
}