zoukankan      html  css  js  c++  java
  • IBM笔试题(_与equals的区别)

    http://topic.csdn.net/t/20050325/08/3879427.html

    题目:
    Integer   i   =   new   Integer(42)  
      Long   l   =   new   Long(42)  
      Double   d   =   new   Double(42.0)  
      下面哪些返回true  
      1:   i==l  
      2:   i==d  
      3:   l==d  
      4:i.equals(l)  
      5:i.equals(d)  
      6:l.equals(d)  
      7:i.equals(42)  

    答案:7;


    编码验证:
      public   class   Equivalence   {  
      public   static   void   main(String[]   args)   {  
      Integer   i   =   new   Integer(42)  
      Long   l   =   new   Long(42)  
      Double   d   =   new   Double(42.0)  
      System.out.println(i==l);  
      System.out.println(i==d);
      System.out.println(l==d);  
      System.out.println(i.equals(l) );   
      System.out.println(i.equals(d) );
      System.out.println(l.equals(d) );  
      System.out.println(i.equals(42));
      }  
      } 

    运行结果:

    1-3:编译不通过;
    4-6:false
    7:true

    原理解释:
    呵呵,我从thinking   in   java电子版中摘了一段:  
      1.   检查对象是否相等  
      关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java领域的人找不到北。下面是一个例子:  
       
       
      //:   Equivalence.java  
       
      public   class   Equivalence   {  
      public   static   void   main(String[]   args)   {  
      Integer   n1   =   new   Integer(47);  
      Integer   n2   =   new   Integer(47);  
      System.out.println(n1   ==   n2);  
      System.out.println(n1   !=   n2);  
      }  
      }   ///:~  
       
      其中,表达式System.out.println(n1   ==   n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true,再是false,因为两个Integer对象都是相同的。但尽管对象的内容 相同,句柄却是不同的,而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。这自然会使第一次接触的人感到惊奇。  
      若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。下面举例说明如何使用:  
       
       
      //:   EqualsMethod.java  
       
      public   class   EqualsMethod   {  
      public   static   void   main(String[]   args)   {  
      Integer   n1   =   new   Integer(47);  
      Integer   n2   =   new   Integer(47);  
      System.out.println(n1.equals(n2));  
      }  
      }   ///:~  
       
      正如我们预计的那样,此时得到的结果是true。但事情并未到此结束!假设您创建了自己的类,就象下面这样:  
       
       
      //:   EqualsMethod2.java  
       
      class   Value   {  
      int   i;  
      }  
       
      public   class   EqualsMethod2   {  
      public   static   void   main(String[]   args)   {  
      Value   v1   =   new   Value();  
      Value   v2   =   new   Value();  
      v1.i   =   v2.i   =   100;  
      System.out.println(v1.equals(v2));  
      }  
      }   ///:~  
       
      此时的结果又变回了false!这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希 望的行为。不幸的是,要到第7章才会学习如何改变行为。但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。  
      大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。

    •    “==”操作符用于比较两个对象的内存地址值是否相等
    •    equals() 方法用于比较两个对象的内容是否一致


    我也来说说自己的认识把。  
       
      在java中内存分为   “栈”和“堆”(Stack   and   Heap)   基本数据类型存储在   "栈"中  
      对象引用类型实际存储在   "堆"中,在“栈”中只是保留引用内存的地址值,就好像知道你家门牌号码就可以找到你家。  
       
      在Java中利用"=="比较变量时候,系统使用变量在stack(栈)中所存的值来作为对比的依据,基本数据类型(int   float   double    
       
      boolean)在stack中所存的值就是其內容值,而引用类型在stack中所存放的值是本身所指向Heap中对象的地址值,而不是原先所設定的值。

  • 相关阅读:
    如何使用robots.txt及其详解
    有序列表
    前端开发大众手册(包括工具、网址、经验等)
    转载:Tim O'Reilly与John Battelle谈即将开幕的Web
    转载:iframe全跨域高度自适应解决方案
    javascript 学习笔记
    【C#文件夹锁】C#文件夹加锁小工具
    Pro Silverlight 5 in C# 分享
    在Winform窗体中使用WPF控件(附源码)
    【C#文件锁】C#加密解密文件小工具
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3158032.html
Copyright © 2011-2022 走看看