展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

equals()和 == 的区别

区别

定义

  • equals()比较的是值和hashCode码,==比较的是内存地址

  • Object类重写了equals(),比较的是对象的内存地址

点击查看详细代码
/*
*我们查看Object类equals()的源码可以知道,equals()接受的参数就是对象本身,所以比较的是内存地址
*/
public boolean equals(Object obj) {
        return (this == obj);
    }

  • String类继承了Object类,重写了Object类的equals(),比较的是对象的值和hasCode码
点击查看详细代码
/*
*查看String类equals()的源码,判断参数是否为String类,之后对值进行判断,这里比较的是对象的值
*/
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;
    }
  • 如果要重写equals(),必须重写hashCode()

测试

点击查看详细代码
/*
*重写equals()
*/

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

     //判断内存地址是否相同
     @Override
     public boolean equals(Object obj) {
     	if(obj instanceof User) {//首先判断obj是否为User对象
     		User u = (User)obj;//强制把obj转成User
     		if(this.name != null && this.name.equals(u.name) && this.age == u.age) {
     			return true;
     		}
     	}
     	return false;
     }

     @Override
     public int hashCode() {
         return this.age * 30;
     }

    public static void main(String[] args) {
        User user1 = new User("二狗", 12);
        User user2 = new User("二狗", 12);
        System.out.println(user1 == user2);
        System.out.println(user1.equals(user2));
        System.out.println("usur1:" + user1.hashCode() + "  " + "user2:" + user2.hashCode());
        System.out.println("user1内存地址:" + user1 + "  " + "user2内存地址:" + user2);
    }
}
  • 未重写equals()时运行结果:new对象user1和user2变量名称存放在栈内存中,这两个对象分别指向存放在堆内存中的数据,==比较的是内存地址,所以为false,object类的equals()比较的是内存地址,所以为false
false
false
usur1:460141958  user2:1163157884
user1内存地址:chx.User@1b6d3586  user2内存地址:chx.User@4554617c
  • 重写equals()之后的运行结果:栈内存中的变量user1指向堆内存中的user1数据,栈内存中的变量user2指向堆内存中的user2数据,==比较的是内存地址,所以为false,重写equals()后堆内存中user2的数据指向栈内存中user1的引用,栈内存中user1和user2都指向堆内存中user1的数据,比较内存地址是一致,所以是true
false
true
usur1:360  user2:360
user1内存地址:chx.User@168  user2内存地址:chx.User@168

重写equals()之后的比较的是hashCode码和内存地址,所以返回的结果为true

posted @ 2021-03-06 23:34  DogLeftover  阅读(67)  评论(0编辑  收藏  举报