首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-02-21 23:40
  • 3189
  • 11268
blog.csdn.net

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

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

JavaSE equals方法的使用

文章目录

        •        我们来说说equals方法,说equals方法,我们又不得不说==,好吧!那就听我一一说来。
          • 1、 == 是一个比较运算符号。
          • 2、equals方法 是Object超类的一个方法。
          • 3、equals方法的语法如下:
          • 4、自定义类Student类演示案例 (没有重写equals方法):
          • 5、测试类使用Junit单元测试输出:
          • 6、控制台输出结果:
        •        比较两个自定义的对象的地址值完全没有意义,如果要用比较地址值,用==就OK了,何必多此一举,来来来,我们看看Java系统类,如String类,我们来看看创建两个对象会发生什么事?
          • 7、String的演示案例代码如下:
          • 8、控制台输出结果:
          • 9、我们来看看源码,惊奇的发现了String重写Object超类中的equals方法。原来如此,小伙伴们是不是有种豁然开朗的感觉?源码如下:
          • 10、于是我们来了灵感,改造Student类,重写Object超类中的equals方法:
          • 11、测试类使用Junit单元测试输出:
          • 12、控制台输出结果:
        •         总结:
          • 13、"=="和“equals”的相同点:
          • 14、“==”和“equals”的异同点:
        •        小伙伴们,本文到此结束,你们都懂了吗?记得关注、点赞、分享、评论和关注微信公众号噢!感谢你们的支持。有疑问或好的建议请与我联系噢!持续更新!敬请关注!

       我们来说说equals方法,说equals方法,我们又不得不说==,好吧!那就听我一一说来。
1、 == 是一个比较运算符号。
  • 既可以比较基本数据类型(不熟悉基本数据的小伙伴点击:Java入门-Java学习路线课程第二课:变量与数据类型 的 java常用的数据类型:),也可以比较引用数据类型(不熟悉引用数据类型的小伙伴点击:Java入门-Java学习路线课程第二课:变量与数据类型 的 java常用的数据类型:)。

  • 注意:基本数据类型比较的是值,引用数据类型比较的是地址值

2、equals方法 是Object超类的一个方法。
  • 只能比较引用数据类型。
3、equals方法的语法如下:
 public boolean equals(Object obj)
  • 1
  • 比较传进来的某个对象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:[email protected]
 * @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 + "]";
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
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:[email protected]
 * @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
    }
}    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
6、控制台输出结果:
false
false
  • 1
  • 2
       比较两个自定义的对象的地址值完全没有意义,如果要用比较地址值,用==就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:[email protected]
 * @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
    }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
8、控制台输出结果:
false
true
  • 1
  • 2
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
10、于是我们来了灵感,改造Student类,重写Object超类中的equals方法:
/**
 * 
 */
package com.javaxyz.equals;

/**
 * @ClassName:Student.java
 * @Description:学生类
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:[email protected]
 * @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;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
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:[email protected]
 * @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
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
12、控制台输出结果:
false
true
  • 1
  • 2
        总结:
13、"=="和“equals”的相同点:
  • 都可以做比较,返回值都是boolean
  • 在没有重写Object超类中的equals方法前,equals方法和 == 运行符号比较引用数据类型一样,比较的是地址值。在Object超类中,equals方法的底层调用方式就是==符号作比较。源码如下:
 public boolean equals(Object obj) {
        return (this == obj);
 }
  • 1
  • 2
  • 3
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(登录(包含拦截器)和注销

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

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览150366 人正在系统学习中
注:本文转载自blog.csdn.net的青云交的文章"https://blog.csdn.net/atgfg/article/details/102576039"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top