最近面试的时候总是遇到这个问题的笔试,以前学的时候没有深究,现在是时候来总结一下了
1.基本类型和包装类
诸如
new Integer(32)==32
new Integer(32).equal(32)
...
此时==比较的就是具体的值,所以在此包装类和基本类型就没有区别,且各包装类和各基本类型可以互等,例:
new Integer(32) == 32f;
new Float(32f) ==32d;
new Double(32d) == 32;
//例子只举了3个,其他的自己触类旁通
...
再来看看equal,看了源码,发现包装类的equal都是先进行了 instanceof 判断,之后才是进行值的比较,例:
new Integer(32).equal(new Integer(32));
//instanceof通过,之后比值,为true
new Integer(32).equal(new Float(32f));
//instanceof 不通过,为flase
new Integer(32).equal(32f);
//instanceof 不通过,为flase
new Integer(32).equal(32);
//instanceof 通过,比值,为true
//至于其他的自己触类旁通,其他包装类不再举例
2.包装类和包装类
new Integer(32) .equals( new Integer(32))
//instanceof 通过,比值,为true
new Integer(32) == new Integer(32);
//这时候直接比较的就是类,类与类一般是不会==的, 为false
new Integer(32) .equals( new Float(32f))
//instanceof 不通过,为false
new Integer(32) == new Float(32f);
//这就很明显为false了
3.基本类型和基本类型
这个就很明显了,基本都成立
32==32f;
32==32d;
//其他不再举例
...
总结:
在真实值相等的情况下(32与32.0,32f…),==在类与类直接比较时总为false,毕竟内存地址不同,在基本类型都为true,equal方法需先考虑是否通过 instanceof ,之后再进行比值。