Java中平时总会遇到一些数据的比较,基本类型是否相等比较,引用类型是否相等比较。
又经常会遇到“==”和equals,有时候分不清两者的区别。现在在这整理一下。
- 当遇到“==”比较的是基本类型数据时,就是比较两者“值”的大小;当比较的是引用类型时,比较的是变量所指向的对象的地址。
- 当遇到equals比较时,只能是比较引用类型。同时要是没有重写equals方法,则比较的是对象的地址,要是重写的时候一般会直接比较对象所含属性的值。(equals方法是Object类的方法,任何类都是Object类的子类。当方法没有重写equals方法意味着直接继承了Object的原生equals方法,此时只比较了对象的地址。但是方法可以重写equals方法,使其比较的是对象属性的值的大小。)
1:当定义一个类,构造两个对象的时候,在没有重写equals方法的时候,看返回的结果:
package equalsTest;
/**
* @ClassName EqualsTest
* @Description TODO
* @Author Kikityer
* @Date 2018/11/9 16:42
* @Version 1.0.0
**/
public class EqualsTest {
public static void main(String[] args) {
User user1 = new User("张伟",26);
User user2 = new User("张伟",26);
if (user1.equals(user2)){
System.out.println("两个对象相等");
}else {
System.out.println("两个对象不相等");
}
}
}
/**
* 定义了一个用户类,用作例子说明
* 1:当没有重写equals方法时,直接比较两个对象是否相等。
* 2:重写了equals方法之后,再来比较两个对象是否相等。
*/
class User{
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
输出结果为:两个对象不相等
结果表明此时比较两个对象的时候是直接调用了Object类的equals方法实现对象的地址的比较的。
下面贴出Object类equals方法的源码
public boolean equals(Object obj) {
return (this == obj);
}
上面equals方法底层调用的是“==”的比较方法,即比较两个对象的地址。
2:当定义一个类,构造两个对象的时候,重写equals方法的时候,看返回的结果:
package equalsTest;
/**
* @ClassName EqualsTest
* @Description TODO
* @Author Kikityer
* @Date 2018/11/9 16:42
* @Version 1.0.0
**/
public class EqualsTest {
public static void main(String[] args) {
User user1 = new User("张伟",26);
User user2 = new User("张伟",26);
if (user1.equals(user2)){
System.out.println("两个对象相等");
}else {
System.out.println("两个对象不相等");
}
}
}
/**
* 定义了一个用户类,用作例子说明
* 1:当没有重写equals方法时,直接比较两个对象是否相等。
* 2:重写了equals方法之后,再来比较两个对象是否相等。
*/
class User{
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//重写了Object类的equals方法
@Override
public boolean equals(Object obj) {
if (obj == null){
return false;
}else if (obj instanceof User){
User user = (User)obj;
if (user.name == this.name && user.age == this.age){
return true;
}
}
return false;
}
}
输出结果为:两个对象相等
结果表明此次比较调用的是重写之后的方法