static { // high value may be configured by property inth=127; StringintegerCacheHighPropValue= sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { inti= parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h;
c == d: true e == f: false c == (a + b): true c.equals(a + b): true g == (a + b): true g.equals(a + b): false
下面对输出结果进行解释。
首先 c == d 的输出结果:由于 c 和 d 都是对于 3 的封装类型,并且 3 在-128 ~ 127 这个缓存范围内,所以其指向的是同一个对象,所以返回 true。
对于 e == f 的输出结果:虽然 e 和 f 都是 321 的封装类型,但是由于 321 在-128 ~ 127 这个缓存范围外,每次对其进行装箱时都是新建一个对象,所以 e 和 f 实质上指向的是不同的对象,因此返回 false。
对于 c == (a + b) 的输出结果:由于 == 右边是一个运算表达式,所以会将 == 两边都自动拆箱进行数值之间的比较,所以返回的是 true。
对于 c.equals(a + b) 的输出结果:由于 a + b 包含运算符,所以会先将 a 和 b 进行拆箱,然后进行运算,最后将结果进行装箱与 c 进行比较,由于 a + b 运算得到的结果是 3,在-128 ~ 127 这个缓存范围内,所以其装箱后与 c 指向的是同一个对象,因此返回 true。
对于 g == (a + b) 的输出结果:由于 == 右边是一个运算表达式,所以会将 == 两边都自动拆箱进行数值之间的比较,虽然 a + b 得到的结果 3 是 int 类型,但是转成 long 类型后还是数字 3,与 g 的数值是相等的,因此返回 true。
对于 g.equals(a + b) 的输出结果:a + b 先拆箱进行运算,得到数值 3,由于数值是 int 类型,且不是进行 == 数值间的比较,不需要拆箱强制转换成 long 类型,因此其装箱得到的是 Integer 类型,此时再与 g 对象(Long 类型)进行比较,由于 Intege 不是 Long 类型,也不是其子类型,所以其返回 false。这可以从 Long.equals 中看出。
1 2 3 4 5 6
publicbooleanequals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } returnfalse; }