如下题:
Integer i = new Integer (42); 
Long 1 = new Long (42); 
Double d = new Double (42.0); Which two expressions evaluate to True? (Choose Two) A.(i ==1) 
B.(i == d) 
C.(d == 1) 
D.(i.equals (d)) 
E.(d.equals (i)) 
F.(i.equals (42)) 
equals比较的是对象的内容, 该怎么理解?
F.(i.equals (42)) 中,i指向的是new Integer (42); 而42就是一个数值,它们如何相等??

解决方案 »

  1.   

    题目是错的
    只有最后一个正确
    至于为什么,你看看下面一行代码就知道了
    Integer i=(Integer)42;
    编译不会出错的哦
      

  2.   

    谢谢楼上的答复可我还是有点不明白:
    你的意思是否是: 在作equals时(F.(i.equals (42)) )会作强制类型转换还望解答
      

  3.   

    谢谢楼上的答复可我还是有点不明白:
    你的意思是否是: 在作equals时(F.(i.equals (42)) )会作强制类型转换还望解答
      

  4.   

    理解有误
    是因为编译的时候做auto-boxing(好像可以叫自动打包吧)了
    把42打包成一个Integer的对象了
    而Integer的equals的源码是:
        public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
        }所以就返回true了
    回答完毕!
      

  5.   

    equals是Object类里的方法,一般的类都覆盖了这个方法,这个方法原先比较的是引用的地址,经过覆盖之后则比较的是对象的内容是否相等。
    例如:
    Integer i = new Integer(10);
    Integer j = new Integer(10);
    如果使用i.equals(j),则结果是ture 因为对象里存的都是10
    而如果使用i == j,则结果是false,i,j是引用 它们指向一个对象,保存的是各自对象在heap中的地址,这当然不同。接下来再回答你这句话:F.(i.equals (42)) 中,i指向的是new Integer (42); 而42就是一个数值,它们如何相等?? 
    equals比较的是对象的内容,JDK1.5版本增加了自动打包跟自动解包的内容,
    Integer i = new Integer(5);
    Integer i = 5;
    这两句在效果上是一样的.
      

  6.   

    谢谢楼上的两位朋友那是否可总结如下:
       对于基本类型:编译器会把“整数”视为"int"类型, "小数"视为"double"类型,能否自动转化还要看它们之间是否兼容;
          int i=1;  //编译器默认把整数视为int类型
         double d=1;  //编译器默int类型自动转为double类型;
          double d=1.0; //编译器默认的小数为double类型     float f=1.0 ;出错, double类型转化为float类型时,精度减少,报错
          float f=1.0f  正确
    ------------
        对于基本类型的包装类:编译器会把“整数”视为"Interger"类型, "小数"视为"Double"类型,只允许类型匹配       Integer i=1; 正确
           Long i= 1; 错误,因Interger不能自动转为Long; -------------    以上的理解是否正确??
      

  7.   

    只有 F.(i.equals (42)) 
     正确吧?