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. public boolean equals (Object o){
    5. //若是两对象地址相等,则值必相等
    6. if( this==o){
    7. return true;
    8. } else if(o instanceof MyObject){
    9. MyObject myObject = (MyObject)o;
    10. //比较两对象的值是否相等
    11. if(i==myObject.i&&str!= null&&str.equals(myObject.str)){
    12. return true;
    13. }
    14. }
    15. return false;
    16. }
    17. }


    18. @Test
    19. public void test1 (){
    20. MyObject o1 = new MyObject();
    21. MyObject o2 = new MyObject();
    22. System.out.println(o1.equals(o2));
    23. }

    输出结果为true

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

猜你喜欢

转载自blog.csdn.net/it_laobai/article/details/80977752
今日推荐