设为首页 收藏本站
查看: 993|回复: 0

[经验分享] IBM笔试题(_与equals的区别)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-5 11:21:30 | 显示全部楼层 |阅读模式
  http://topic.iyunv.com/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中对象的地址值,而不是原先所設定的值。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-122892-1-1.html 上篇帖子: IBM大型主机(Mainframe)技术简介之一——系统概述 下篇帖子: IBM推出Easy Blue计划:简化合作方式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表