equals与==的区别?

==和equals的区别

  • 记得刚出来找工作,很容易在面试或笔试中遇到问equals和==的区别,我很容易答出它们的区别是前者比较两个对象的值,后者比较两个对象的地址是否相等,很长时间我对此深信不疑,但是当你真正研究源码的时候,你会发现这个答案其实是不对的。
  • 我们知道equals是Object的方法,那我们先看看在Object这个类中是如何定义的:

     
    1. public boolean equals(Object obj) {

    2. return (this == obj);

    3. }

    显然意见,在Object类中的equls方法其实也是用==来判断两个对象是否相等。

  • 但是看下面这段代码:

     
    1. @Test

    2. public void testEqual() {

    3. String s1 = new String("abc");

    4. String s2 = new String("abc");

    5. System.out.println(s1 == s2);

    6. System.out.println(s1.equals(s2));

    7. }

    输出结果是falseture,这是因为在String类中对Object的equals方法实现了覆盖,源码如下:

     
    1. public boolean equals(Object anObject) {

    2. if (this == anObject) {

    3. return true;

    4. }

    5. if (anObject instanceof String) {

    6. String anotherString = (String)anObject;

    7. int n = value.length;

    8. if (n == anotherString.value.length) {

    9. char v1[] = value;

    10. char v2[] = anotherString.value;

    11. int i = 0;

    12. while (n-- != 0) {

    13. if (v1[i] != v2[i])

    14. return false;

    15. i++;

    16. }

    17. return true;

    18. }

    19. }

    20. return false;

    21. }

    可见equals的功能其实是由我们自己决定的,如果是我们自己定义的对象又该如何判断值的相等呢?示例如下:

     
    1. class MyObject{

    2. int i = 1;

    3. String str = "hello";

    4.  
    5. public boolean equals(Object o){

    6. //若是两对象地址相等,则值必相等

    7. if(this==o){

    8. return true;

    9. }else if(o instanceof MyObject){

    10. MyObject myObject = (MyObject)o;

    11. //比较两对象的值是否相等

    12. if(i==myObject.i&&str!=null&&str.equals(myObject.str)){

    13. return true;

    14. }

    15. }

    16. return false;

    17. }

    18. }

    19.  
    20.  
    21. @Test

    22. public void test1(){

    23. MyObject o1 = new MyObject();

    24. MyObject o2 = new MyObject();

    25. System.out.println(o1.equals(o2));

    26. }

    输出结果为true

  • 结论equals和==的本质区别在于前者是方法,后者是操作符,我们可以自定义equals的行为,却无法定义==的行为,于其说equals方法是比较两个对象的值,倒不如说是我们希望它能达到这种效果而已,它所能表达的只是一种规范,具体怎么做仍然在你。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值