﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-一步一个脚印-文章分类-java笔试题学习总结</title><link>http://www.blogjava.net/flysky19/category/18464.html</link><description>java之路</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:44:17 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:44:17 GMT</pubDate><ttl>60</ttl><item><title>一道IBM笔试题（考__与equals的区别）061102</title><link>http://www.blogjava.net/flysky19/articles/88195.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sat, 16 Dec 2006 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/88195.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/88195.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/88195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/88195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/88195.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://topic.csdn.net/t/20050325/08/3879427.html">http://topic.csdn.net/t/20050325/08/3879427.html</a>
		</p>
		<p>题目：<br />Integer   i   =   new   Integer(42)   <br />  Long   l   =   new   Long(42)   <br />  Double   d   =   new   Double(42.0)   <br />  下面哪些返回true   <br />  1:   i==l   <br />  2:   i==d   <br />  3:   l==d   <br />  4:i.equals(l)   <br />  5:i.equals(d)   <br />  6:l.equals(d)   <br />  7:i.equals(42)   </p>
		<p>答案：7；</p>
		<p>
				<br />编码验证：<br />  public   class   Equivalence   {   <br />  public   static   void   main(String[]   args)   {   <br />  Integer   i   =   new   Integer(42)   <br />  Long   l   =   new   Long(42)   <br />  Double   d   =   new   Double(42.0)   <br />  System.out.println(i==l);   <br />  System.out.println(i==d); <br />  System.out.println(l==d);   <br />  System.out.println(i.equals(l) );    <br />  System.out.println(i.equals(d) ); <br />  System.out.println(l.equals(d) );   <br />  System.out.println(i.equals(42)); <br />  }   <br />  }  </p>
		<p>运行结果：</p>
		<p>1-3：编译不通过；<br />4-6：false<br />7:true</p>
		<p>原理解释：<br />呵呵,我从thinking   in   java电子版中摘了一段:   <br />  1.   检查对象是否相等   <br />  关系运算符==和!=也适用于所有对象，但它们的含义通常会使初涉Java领域的人找不到北。下面是一个例子：   <br />    <br />    <br />  //:   Equivalence.java   <br />    <br />  public   class   Equivalence   {   <br />  public   static   void   main(String[]   args)   {   <br />  Integer   n1   =   new   Integer(47);   <br />  Integer   n2   =   new   Integer(47);   <br />  System.out.println(n1   ==   n2);   <br />  System.out.println(n1   !=   n2);   <br />  }   <br />  }   ///:~   <br />    <br />  其中，表达式System.out.println(n1   ==   n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true，再是false，因为两个Integer对象都是相同的。但尽管对象的内容相同，句柄却是不同的，而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false，再是true。这自然会使第一次接触的人感到惊奇。   <br />  若想对比两个对象的实际内容是否相同，又该如何操作呢？此时，必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”，那些类型直接使用==和!=即可。下面举例说明如何使用：   <br />    <br />    <br />  //:   EqualsMethod.java   <br />    <br />  public   class   EqualsMethod   {   <br />  public   static   void   main(String[]   args)   {   <br />  Integer   n1   =   new   Integer(47);   <br />  Integer   n2   =   new   Integer(47);   <br />  System.out.println(n1.equals(n2));   <br />  }   <br />  }   ///:~   <br />    <br />  正如我们预计的那样，此时得到的结果是true。但事情并未到此结束！假设您创建了自己的类，就象下面这样：   <br />    <br />    <br />  //:   EqualsMethod2.java   <br />    <br />  class   Value   {   <br />  int   i;   <br />  }   <br />    <br />  public   class   EqualsMethod2   {   <br />  public   static   void   main(String[]   args)   {   <br />  Value   v1   =   new   Value();   <br />  Value   v2   =   new   Value();   <br />  v1.i   =   v2.i   =   100;   <br />  System.out.println(v1.equals(v2));   <br />  }   <br />  }   ///:~   <br />    <br />  此时的结果又变回了false！这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals()，否则不可能表现出我们希望的行为。不幸的是，要到第7章才会学习如何改变行为。但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。   <br />  大多数Java类库都实现了equals()，所以它实际比较的是对象的内容，而非它们的句柄。 </p>
		<p> </p>
		<p>
				<br />我也来说说自己的认识把。   <br />    <br />  在java中内存分为   “栈”和“堆”(Stack   and   Heap)   基本数据类型存储在   "栈"中   <br />  对象引用类型实际存储在   "堆"中，在“栈”中只是保留引用内存的地址值，就好像知道你家门牌号码就可以找到你家。   <br />    <br />  在Java中利用"=="比较变量时候，系统使用变量在stack(栈)中所存的值来作为对比的依据，基本数据类型（int   float   double     <br />    <br />  boolean）在stack中所存的值就是其內容值，而引用类型在stack中所存放的值是本身所指向Heap中对象的地址值，而不是原先所設定的值。   </p>
<img src ="http://www.blogjava.net/flysky19/aggbug/88195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-16 15:56 <a href="http://www.blogjava.net/flysky19/articles/88195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>