对java里equals的一些理解!

    技术2022-05-11  144

        此文适合java入门者阅读,希望高手指点迷津,偶才学几天,可能写的错误百出,好多概念的理解也不是很准确.不要bs偶啊,有错误希望指出,谢谢.

        <<java编程思想>>里有这样一个程序(稍微做了些修改)

    public class EqualsMethod {       //A程序    int i;

     public static void main(String[] args) {  

          EqualsMethod v1=new EqualsMethod();      EqualsMethod v2=new EqualsMethod();      v1.i=v2.i=100;      System.out.println(v1.equals(v2)); }

    }

         第一次看到这里的时候,我第一眼觉得结果为true,运行的结果其实是false,书上说equals默认行为是比较reference,所以除非在新类里overide equals(),否则得不到想要的结果.当时没有弄多大明白,就跳过去了.想想,有空再思考它.后来,在baidu知道里,碰到有人问这个问题,想 给别人回答,却发觉自己原来也不是理解的很透彻.所以就狠下心来,好好研究下,查了不少资料,终于有些头绪.

           首先说说关于equals()的一些理解,,equals是面向对象的操作符,是任何类的一个方法,都可以调用它,;语法格式为 Reference1.equals(Reference2 ) ,   如果要比较两个对象是否一致,就可以使用equals.

        运行上面的程序,结果为false,equals比较了v1,v2这两个reference,如果是新手,譬如我自己吧,会纳闷,程序中对v1,v2进行了赋了相等的值,,那就应该是相等的,结果应该是true才对.事实却不是这样的.那我们改动下程序,看下另外的运行结果:

         public class EqualsMethod1 {    //B程序     /**  * @param args  */ public static void main(String[] args) {    EqualsMethod1 v1=new EqualsMethod1();      EqualsMethod1 v2=new EqualsMethod1();          System.out.println(v1.equals(v2));          }

    }

        结果还是false,这样可以说明定义"i"和赋值,对于比较结果没有什么影响的.对上面的程序再稍做修改:

     public class EqualsMethod {   //C程序      public static void main(String[] args) {        EqualsMethod v1=new EqualsMethod();      EqualsMethod v2=new EqualsMethod();      v1=v2;      System.out.println(v1.equals(v2));           }

    }

         输出结果为true.v1=v2?该怎样理解呢?赋值?还是其他???先放到一边....查了一些资料,得出了equals做比较时,是调用的句柄做比较.(其实我也不知道句柄是个什么概念,)" 在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄,句柄也可以映射到唯一的对象。""这个是在windwos中的定义,不知道拿到这里来是否适用.暂且认为一样吧.所以在程序b里,两个对象,v1,v2在new的时候,都各自被分配了句柄,,句柄是唯一的,.所以程序b的执行结果为false.

         在程序c,出现了v1=v2;结果就true了,又是为什么呢?原来v1=v2,不是把v2的值赋给v1,而是把v2句柄copy给v1,所以v1,v2指向的就是同一个对象.结果自然就true了.      还想写,不过觉得好多都理解错了,可能上面写的都是错的,思绪清楚了,再写吧!哎!失败!


    最新回复(0)