*Java Integer*
java 中的 Integer 类型作为常用类型,有一些特殊地方需要注意:
- Integer.SIZE = 32 bits
integer在 java 中使用 32 个字节保存,所以能存储的数字范围:-2147483648~2147483647 即 2^31 ~ 2^31-1
但是其中有些有意思的地方:
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 127;
Integer f = 127;
Integer ee = 128;
Integer ff = 128;
Long g = 3L;
System.out.println(c == d); //true
System.out.println(e == f); //true
System.out.println(ee == ff); //false
System.out.println(c == (a+b)); //true
System.out.println(c.equals(a+b)); //true
System.out.println(g == (a+b)); //true
System.out.println(g.equals(a+b)); //false
System.out.println(ee.hashCode() + "--" + ff.hashCode()); //true
- 结果明显看出,当 Integer 大于 127 到达 2^7 时,== 返回 false,说明两者的引用地址不相同。
- Integer 的范围是 -2147483648~2147483647,为什么两者在内存中的地址不同呢?
原因
在 Java 中 Integer 范围是在 -128 ~ 127,创建实例时内存中在该范围的 Integer 实例是直接使用 Java 原生 Integer 类型保存,允许在内存中重用,而大于该范围时,每次创建 Integer 实例都相当于 new Integer(),不管数值是否相等。所以在上述例子中 “128==128” 返回 flase。
再者是 Integer 和 float 类型的对比,得出的结果原因是:”==” 在遇到算术运算符时会自动拆箱,将类型转换;而”equals()”则只是用于比较数值是否相等,无关于对象类型,所以”equals()”不处理数据转型。