日期:2014-05-20  浏览次数:20766 次

有关equals的程序
下面这个程序的结果应该是多少?
public   class   Asdf
{
public   static   void   main(String[]   args)
{
Integer   b1   =   new   Integer   (   1   );
                Integer   b2   =   new   Integer   (   1   );
                Object   obj1   =   (   Object   )b1;
                Object   obj2   =   (   Object   )b2;
if     (   obj1   ==   obj2   )
          if     (   obj1.equals   (   obj2   )   )
                    System.out.println   (   "a "   );
          else
                    System.out.println   (   "b "   );
else
            if     (   obj1.equals   (   obj2   )   )
                    System.out.println   (   "c "   );
            else
                    System.out.println   (   "d "   );
}
}

------解决方案--------------------
结果为c

==和equals()两种方式比较:如果测试两个简单类型的树枝是否相等,一定要使用==来比较;如果要比较两个对象的值是否相等,则用对象的equals()来比较;如果需要比较两个引用变量是否指向同一个对象,则用==来比较。

此处明显用的是int的封装类Integer分别创建了两个对象b1和b2,指向两个不同对象,而obj1 == obj2 含意是“两个引用变量是否指向同一个对象”

对象的值要用equals()方法,很明显两个对象的值是向等的。

所以最终结果是c。

此段代码改之如下,结果与上会不同的

public class Bsdf
{
public static void main(String[] args)
{
Integer b1 = new Integer ( 1 );
Integer b2 = b1;
Object obj1 = ( Object )b1;
Object obj2 = ( Object )b2;
if ( obj1 == obj2 )
if ( obj1.equals ( obj2 ) )
System.out.println ( "a " );
else
System.out.println ( "b " );
else
if ( obj1.equals ( obj2 ) )
System.out.println ( "c " );
else
System.out.println ( "d " );
}
}

------解决方案--------------------
lz问:(obj1 == obj2 )是指两者的内容相等,而obj1.equals ( obj2 )是指两者的内存地址相等。对吗?
答:对于引用型变量obj1和obj2而言,obj1 == obj2 是比较两者的引用地址(也即lz所说的内存地址),equals这里就是比引用对象的内容。

另:Integer b1 = new Integer ( 1 );是指让b1指向内容为1的地址空间