equals与“==”的区别

导读:本篇文章讲解 equals与“==”的区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

学无止境,周末也得学习,今天看大佬们的博客看见个有趣的东西,也是Java面试的基础面试题,于是兴趣就来了,整理了一下我自己对于“==”和equals的初步理解吧。

一、在Java对象相等时怎么判断的

1、物理上相等,即就是同一对象
2、逻辑上相等,不是同一对象,但是对象的内容相等(如字面量相等)

二、判断方法

1.比较引用地址

“==”可用于判断基本数据类型的相等性,也可判断需要比较的两个对象的引用地址是否相等,得出两个对象是否为同一对象。

代码如下(示例):

public class Test01 {

	public static void main(String[] args) {
		// 创建一个对象,两个变量都引用这个这个对象
		String str1 = new String();
		String str2 = str1;
		System.out.println("两变量引用一对象比较结果为:"+(str1==str2));
		// 创建两个对象,两个变量分别引用这个这两个对象
		String str3 = new String();
		String str4 = new String();
		System.out.println("两个变量分别引用两个对象比较结果为:"+(str3==str4));
	}
}

代码如下(输出):

两变量引用一对象比较结果为:true
两个变量分别引用两个对象比较结果为:false

小结

一个对象两个变量都引用的时候比较它们两内存地址是相同的,所以两个变量则值是相等的,返回的是true。当两个变量分别引用两个对象时,比较它们两内存地址是不相同的,所以两个变量则值是不相等的,返回的是false。

2.比较对象内容

2.1 equals的概括

equals方法默认比较的是对象的引用地址,从根源来说equals的作用和“==”是相同的。

equals方法原码如下

在这里插入图片描述
从原码可以看见equals的方法就是“==”一样的
所以想要这个方法发挥作用——比较对象内容,就得重写这个方法

2.2 equals方法的重写(浅谈)

首先我们建立一个学生类,在学生类中将从祖宗类object继承过来的equals重写,左键里面source 里面就有一个Generate hashCode开头的点一下全选编辑好的 属性就可以直接生成重写代码

代码如下(示例):

public class Student {
	private String name;
	private String id;
	public Student() {
		
	}
	public Student(String name, String id) {
		super();
		this.name = name;
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	// 重写hashCode方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	// 重写equals方法
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}

2.3 equals方法对对象是否相等做判断

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

代码如下(测试):

public class Test02 {

	public static void main(String[] args) {
		Student student01 = new Student("张三", "123456789");
		Student student02 = new Student("张三", "123456789");
		Student student03 = new Student("张三", "987654321");
		System.out.println("student01和student02相比结果为:"+student01.equals(student02));
		System.out.println("student01和student03相比结果为:"+student01.equals(student03));
	}

}

代码如下(输出):

student01和student02相比结果为:true
student01和student03相比结果为:false

小结

经过我们的重写的方法后equals方法终于发挥了它应有的作用,对比的是字面内容了,就比如student01和student02,一看就是一个人,姓名和身份证号都一样,比较返回的就应该是true ,但是如果不重写比较的就是内存地址了,返回的是false 这与我们的现实生活一点都不符合,而重写后的equals就符合我们所认同的信息了。

总结

“= =”和重写后equals方法的区别是:
“= =”是一个运算符,即可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是两个被比较对象的内存地址。

equals是一个方法,只能比较引用数据类型,比较两个对象中的属性(字面量是否一致)。

如果不重写equals,那么它的功能就和“==”没有区别,就没有多大意义。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/5112.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!