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: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 + "]";
}

}
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: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
    }
    }
    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: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
    }
    }
    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: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;
}

}
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: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
    

    }
    }
    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方法比较的是对象中的属性值。
    ————————————————
    版权声明:本文为CSDN博主「青云交」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/atgfg/article/details/102576039

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值