==与equals的区别
== | equals | |
---|---|---|
情况一 | 如果等号左右两侧是基本数据类型,则比较的是值是否相等。 | 如果类没有重写equals()方法,那么等价于"=="的情况,即比较两个对象的地址值是否相等。 |
情况二 | 如果等号左右两侧是引用数据类型(类对象),则比较的是两个对象的内存地址值是否相等。 | 如果类重写了equals()方法,那么比较的是两个类对象的内容是否相等。 |
==
概述:比较两个对象是否相等。
class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
}
public class Demo {
public static void main(String[] args) {
/*
==的两种情况:
1.如果是基本数据类型,则比较值是否相等
2.如果是引用数据类型,则比较对象地址值是否相等
*/
// 1.比较值是否相等
System.out.println(2 == 2);
// 2.比较地址值是否相等
Person p1 = new Person("张三");
Person p2 = new Person("张三");
System.out.println(p1 == p2);
System.out.println("p1的地址值:"+System.identityHashCode(p1));
System.out.println("p2的地址值:"+System.identityHashCode(p2));
}
}
/**
* 打印结果:
* true
* false
*/
查看控制台打印情况:
equals
概述:也是比较两个对象是否相等,不过要分是否重写equals()两种情况。
// 没有重写equals()方法的类
class PersonWithoutEquals {
private String name;
public PersonWithoutEquals() {
}
public PersonWithoutEquals(String name) {
this.name = name;
}
}
// 重写了equals()方法的类
class PersonWithEquals {
private String name;
public PersonWithEquals() {
}
public PersonWithEquals(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonWithEquals that = (PersonWithEquals) o;
return name != null ? name.equals(that.name) : that.name == null;
}
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
}
public class Demo {
public static void main(String[] args) {
/*
equals()的两种情况:
1.如果类没有重写equals()方法,那么比较的是内存地址值,等价于"=="
2.如果类重写了equals()方法,那么比较的类对象的内容
*/
// 1.没有重写equals()方法
PersonWithoutEquals p1 = new PersonWithoutEquals("张三");
PersonWithoutEquals p2 = new PersonWithoutEquals("张三");
System.out.println(p1.equals(p2));
System.out.println(p1 == p2);
System.out.println("p1的地址值:" + System.identityHashCode(p1));
System.out.println("p2的地址值:" + System.identityHashCode(p2));
// 2.重写了equals()方法
PersonWithEquals p3 = new PersonWithEquals("张三");
PersonWithEquals p4 = new PersonWithEquals("张三");
System.out.println(p3.equals(p4));
System.out.println(p3 == p4);
System.out.println("p3的地址值:" + System.identityHashCode(p3));
System.out.println("p4的地址值:" + System.identityHashCode(p4));
}
}
/**
* 打印结果:
* false
* false
* true
* false
*/
equals重写方法是通过IDEA快捷生成的,其代码如下:
为这份代码注释下:
手动重写equals()方法代码如下:
其中Object类中的equals方法源码如下:
也就是如果不重写equals方法,那么默认比较就是用的是“==”,即比较内存地址。