问题一 Integer的装箱拆箱问题
【参考】Integer的装箱和拆箱
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals((a+b)));
System.out.println(g == (a+b));
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));
对于这一段代码,有几个点值得关注:
- 做比较的时候“==”,如果两边都是引用类型(Integer),则比较地址。如果有一边是基本类型(int),则编译之后,对象需要拆箱(intValue()),再进行比较。
- 做四则运算的时候,也是要进行拆箱操作。
- 但是在用equals()函数作比较的时候,需要传入的是一个对象,因此必要的时候会自动装箱。以下是equals函数的源码:
/**
* Compares this object to the specified object. The result is
* {@code true} if and only if the argument is not
* {@code null} and is a {@code Long} object that
* contains the same {@code long} value as this object.
*
* @param obj the object to compare with.
* @return {@code true} if the objects are the same;
* {@code false} otherwise.
*/
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
ps:这里的调用者是Long类型,但是传入参数的自动装箱类型是由参数本身决定的。比如:System.out.println(g.equals(a+b));
编译后为:System.out.println(g.equals(Integer.valueOf(a.intValue()+b.intValue())));这里的g是一个Long类型,所以obj instanceof Long 直接return false;
- System.out.println(g.equals(3L));会是true,但是System.out.println(g.equals(3));会是false
问题二:Integer的两个函数:highestOneBit 和 lowestOneBit
【参考】 single number 的补充部分