java怎么拦截某个对象
245
2022-08-29
Integer类之缓存
在开始详细的说明问题之前,我们先看一段代码
1 public static void compare1(){2 Integer i1 = 127, i2 = 127, i3 = 128, i4 = 128;3 System.out.println(i1 == i2);4 System.out.println(i1.equals(i2));5 System.out.println(i3 == i4);6 System.out.println(i3.equals(i4));7 }
这段代码输出的结果是什么呢?
答案是:
是不是感到奇怪呢?为什么127的时候==是true,128的时候就变成了false?其实要回答这个问题不难。
Integer在赋值的时候会发生自动装箱操作,调用Integer的valueOf方法,那么我们看一下java的源码(1.8):
:
1 /** 2 * Cache to support the object identity semantics of autoboxing for values between 3 * -128 and 127 (inclusive) as required by JLS. 4 * 5 * The cache is initialized on first usage. The size of the cache 6 * may be controlled by the {@code -XX:AutoBoxCacheMax=
我们看到IntegerCache的low定义为-128,high默认定义为127.但是high是可以配置的,如果没有配置才是127.我们不去看配置的情况,因为java默认是没有配置的。看一下cache数组,长度为high-low+1,从-128开始到127,存在cache数组内。从上面的代码中可以看出,java在申请一个大于等于-128小于等于127的数时,其实是从cache中直接取出来用的,如果不在这个范围则是new了一个Integer对象。对于==,他比较的是地址。对于int来说比较的是值。对于equals,比较的是内容(要看equals的具体实现)。看一下Integer里面的实现:
1 /** 2 * Compares this object to the specified object. The result is 3 * {@code true} if and only if the argument is not 4 * {@code null} and is an {@code Integer} object that 5 * contains the same {@code int} value as this object. 6 * 7 * @param obj the object to compare with. 8 * @return {@code true} if the objects are the same; 9 * {@code false} otherwise.10 */11 public boolean equals(Object obj) {12 if (obj instanceof Integer) {13 return value == ((Integer)obj).intValue();14 }15 return false;16 }
而value这是Integer类的成员变量。
而intValue则是Integer类的方法,实现如下:
它比较的确实是值的大小。
因此i1==i2和i1.equals(i2)都是true
i3==i4为false
i3.equals(i4)为true。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~