有关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的地址空间