从Integer与int的各种比较来看Integer的缓存机制及包装类的拆箱装箱

  首先来看下面一道程序,猜一猜它的运行结果?

从Integer与int的各种比较来看Integer的缓存机制及包装类的拆箱装箱

设定了一系列Integer与int的值,然后做各种比较,其中设定127与128是有缘故的,往下看!运行结果是什么?懒得猜咱们就直接运行,结果如下:

从Integer与int的各种比较来看Integer的缓存机制及包装类的拆箱装箱

对于这种结果,咱们一一解释:

1、首先int是基本数据类型,Integer是包装类型,a与b做比较时,b会自动拆箱成基本数据类型与a做比较,所以他们的比较为true;

2、a与c做比较的结果和a与b的比较原理是一样的,所以也为true;

3、b与c做比较,由于都是包装类型,所以比较的是对象地址,两个不同的对象比较,当然为false了;

4、c与d做比较的原理和b与c做比较的原理是一样的,也为false;

5、重点来了,b与b2做比较,结果为true,e与f做比较,结果竟然为false,why?

首先要说的是,Integer e = 128,以这样形式来赋值的,都是调用Integer.valueOf()来进行赋值,所以我们从这个方法来入手。

从Integer与int的各种比较来看Integer的缓存机制及包装类的拆箱装箱

从源码中可以看出,调用这个方法时,会进行判断,从IntegerCache这个缓存类中进行判断,其中IntegerCache.low是-128,IntegerCache.high是127,在这个范围内的,就直接从这个缓存类中返回了,而不在这个缓存类范围的,就要新建Integer对象来返回了,下面就来看一看这个缓存机制IntegerCache。

从Integer与int的各种比较来看Integer的缓存机制及包装类的拆箱装箱

从源码中可以看出,在类加载时,Integer的缓存机制会把-128到127这个范围内的值加载进内存,以便用时直接取,这个范围值是可以调节的,在程序执行时加上参数-XX:AutoBoxCacheMax=<size>就可以设定最大的范围值了。所以b与b2的比较结果,e与f的比较结果,大家也能明白了!

6、最后,f与g做比较,这是包装类拆箱后做比较的结果,所以为true。

总结:记住包装类的拆箱装箱功能和Integer的缓存机制,再出现这样的比较,就能随心所欲的回答了!