Java入门-Java学习路线扩展课程:equals的使用

本博客地址 | GitHub | 更多资源免费下载

       各位小伙伴,大家晚上好!今天我给大家带来equals方法的使用,主要从两个方面去讲解:第一种,就是系统提供的类使用equals方法进行比较,另一种就是自定义类使用equals方法进行比较。希望大家喜欢。

JavaSE equals方法的使用

       我们来说说equals方法,说equals方法,我们又不得不说==,好吧!那就听我一一说来。

1、 == 是一个比较运算符号。
2、equals方法 是Object超类的一个方法。
  • 只能比较引用数据类型。
3、equals方法的语法如下:
 public boolean equals(Object obj)
  • 比较传进来的某个对象obj是否与此对象this“相等”,返回值为boolean类型。
4、自定义类Student类演示案例 (没有重写equals方法):
package com.javaxyz.equals;

/**
 * @ClassName:Student.java
 * @Description:学生类
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:DongGaoYun@qq.com
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:41:24
 * @Version:1.0 
 * 
 */
public class Student {
	// 属性
	private int sid;// 编号
	private String sname;// 姓名

	// 方法
	/**
	 * @return the sid
	 */
	public int getSid() {
		return sid;
	}

	/**
	 * @param sid
	 *            the sid to set
	 */
	public void setSid(int sid) {
		this.sid = sid;
	}

	/**
	 * @return the sname
	 */
	public String getSname() {
		return sname;
	}

	/**
	 * @param sname
	 *            the sname to set
	 */
	public void setSname(String sname) {
		this.sname = sname;
	}

	/**
	 * 
	 */
	public Student() {
	
	}

	/**
	 * @param sid
	 * @param sname
	 */
	public Student(int sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}
}
5、测试类使用Junit单元测试输出:
package com.javaxyz.test;

import org.junit.Test;

import com.javaxyz.equals.Student;

/**
 * @ClassName:TestStudent.java
 * @Description:使用Junit单元测试输出
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:DongGaoYun@qq.com
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:45:04
 * @Version:1.0
 */
public class TestStudent {

	@Test
	public void test() {
		// 创建对象
		Student s1 = new Student(1, "小明");
		Student s2 = new Student(1, "小明");
		// 没有重写equals方法之前,以下两个打印结果都为false,原因就是== 和 equals都是在比较对象的地址值
		System.out.println(s1 == s2); // f
		System.out.println(s1.equals(s2)); // f
    }
}    
6、控制台输出结果:
false
false

       比较两个自定义的对象的地址值完全没有意义,如果要用比较地址值,用==就OK了,何必多此一举,来来来,我们看看Java系统类,如String类,我们来看看创建两个对象会发生什么事?

7、String的演示案例代码如下:
package com.javaxyz.test;

import org.junit.Test;

import com.javaxyz.equals.Student;

/**
 * @ClassName:TestStudent.java
 * @Description:使用Junit单元测试输出
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:DongGaoYun@qq.com
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:45:04
 * @Version:1.0
 */
public class TestStudent {

	@Test
	public void test() {
		// 创建对象		
		String str1 = new String();
		String str2 = new String();
		System.out.println(str1 == str2);       //f
		System.out.println(str1.equals(str2)); //t
    }
}  
8、控制台输出结果:
false
true
9、我们来看看源码,惊奇的发现了String重写Object超类中的equals方法。原来如此,小伙伴们是不是有种豁然开朗的感觉?源码如下:
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;
}
10、于是我们来了灵感,改造Student类,重写Object超类中的equals方法:
/**
 * 
 */
package com.javaxyz.equals;

/**
 * @ClassName:Student.java
 * @Description:学生类
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:DongGaoYun@qq.com
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:41:24
 * @Version:1.0 重写equals方法约定: 两个学生对象:只要id和姓名相同,那么我们就说是同一对象。
 * 
 */
public class Student {
	// 属性
	private int sid;// 编号
	private String sname;// 姓名

	// 方法
	/**
	 * @return the sid
	 */
	public int getSid() {
		return sid;
	}

	/**
	 * @param sid
	 *            the sid to set
	 */
	public void setSid(int sid) {
		this.sid = sid;
	}

	/**
	 * @return the sname
	 */
	public String getSname() {
		return sname;
	}

	/**
	 * @param sname
	 *            the sname to set
	 */
	public void setSname(String sname) {
		this.sname = sname;
	}

	/**
	 * 
	 */
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param sid
	 * @param sname
	 */
	public Student(int sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}

	/*
	 * 重写equals方法
	 */
	@Override
	public boolean equals(Object obj) {
		// 提高效率
		if (this == obj)
			return true;
		if (null == obj)
			return false;
		// 判断类型是否属于Student(注意是本对象)
		if (!(obj instanceof Student))
			return false;
		Student s = (Student) obj;// 向下转型
		//判断两个属性值是否相等,如果是数值就用==比较,如果是引用类型就用equals
		if (s.getSid() != this.getSid())
			return false;
		// 如果对象的id和姓名相等,那么就返回true
		if (s.getSid() == this.getSid() && this.getSname().equals(s.getSname())) {
			return true;
		}
		return false;
	}
}
11、测试类使用Junit单元测试输出:
package com.javaxyz.test;

import org.junit.Test;

import com.javaxyz.equals.Student;

/**
 * @ClassName:TestStudent.java
 * @Description:使用Junit单元测试输出
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:DongGaoYun@qq.com
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:45:04
 * @Version:1.0
 */
public class TestStudent {

	@Test
	public void test() {
		// 创建对象
		Student s1 = new Student(1, "小明");
		Student s2 = new Student(1, "小明");
		// 没有重写equals方法之前,以下两个打印结果都为false,原因就是== 和 equals都是在比较对象的地址值
		System.out.println(s1 == s2); // f
		System.out.println(s1.equals(s2)); // f

		/*
		 * 我们先来观察一个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; }
		 * 说明String也是重写了equals方法,所以第一个结果为:false 第二个结果为true
		 * 
		 */
		String str1 = new String();
		String str2 = new String();
		System.out.println(str1 == str2);
		System.out.println(str1.equals(str2));
		
		// 改造它
		// 注意:比较两个自定义的对象的地址值完全没有意义,要想让它们的比较有意义,就要给它约定一下,
		// 写equals方法。让它们去比较内容。也就是说只要Student类的属性sid相等,且sname的值也相等,我们就可以说它们是同一对象,这样我们就可以去重或做其他的业务操作,只有这样才有意义。
		// 重写了equals方法之后:第一个结果为:false 第二个结果为true 这样我们程序员用的才有意义
		System.out.println(s1 == s2); // f
		System.out.println(s1.equals(s2)); // true
	}
}
12、控制台输出结果:
false
true

        总结:

13、"=="和“equals”的相同点:
  • 都可以做比较,返回值都是boolean
  • 在没有重写Object超类中的equals方法前,equals方法和 == 运行符号比较引用数据类型一样,比较的是地址值。在Object超类中,equals方法的底层调用方式就是==符号作比较。源码如下:
 public boolean equals(Object obj) {
        return (this == obj);
 }
14、“==”和“equals”的异同点:
  • == 号比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值
  • equals方法只能比较引用数据类型,在重写Object超类中的equals方法后,equals方法比较的是对象中的属性值。

       小伙伴们,本文到此结束,你们都懂了吗?记得关注、点赞、分享、评论和关注微信公众号噢!感谢你们的支持。有疑问或好的建议请与我联系噢!持续更新!敬请关注!


———— 精 选 文 章 ————
  1. Java入门-Java学习路线课程第一课:初识JAVA
  2. Java入门-Java学习路线课程第二课:变量与数据类型
  3. Java入门-Java学习路线课程第三课:选择结构
  4. Java入门-Java学习路线课程第四课:循环结构
  5. Java入门-Java学习路线课程第五课:一维数组
  6. Java入门-Java学习路线课程第六课:二维数组
  7. Java入门-Java学习路线课程第七课:类和对象
  8. Java入门-Java学习路线课程第八课:方法和方法重载
  9. Java入门-Java学习路线课程面试篇:取商 / 和取余(模) % 符号的使用
  10. Java进阶-Java学习路线课程第一课:Java集合框架-ArrayList和LinkedList的使用
  11. Java进阶-Java学习路线课程第二课:Java集合框架-HashSet的使用及去重原理
  12. Spring框架-Java学习路线课程第一课:Spring核心
  13. Spring框架-Java学习路线课程:Spring的扩展配置
  14. Springboot框架-Java学习路线课程:Springboot框架的搭建之maven的配置
  15. java学习:在给学生演示用Myeclipse10.7.1工具生成War时,意外报错:SECURITY: INTEGRITY CHECK ERROR
  16. 使用jquery发送Ajax请求的几种异步刷新方式
  17. idea Springboot启动时内嵌tomcat报错- An incompatible version [1.1.33] of the APR based Apache Tomcat Native
  18. 一个简单的SSM框架Demo(登录(包含拦截器)和注销

更多免费资源请关注微信公众号:

©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页