java基础之Integer与int类型输出示例解析
作者:hello_world
这篇文章主要为大家介绍了java基础之Integer与int类型输出示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
正文
说说下面代码的输出:
Integer a1 = 10, b1 = 128; Integer a2 = 10, b2 = 128; Integer a3 = new Integer(10); Integer b3 = new Integer(128); System.out.println(a1==a2);//true System.out.println(a1==a3);//false System.out.println(b1==b2);//false System.out.println(b1==b3);//false
代码详解
Integer为引用对象,那么两个Integer对象使用"=="比较的就是空间地址,如果a1==a2那就说明a1与a2的空间地址是相同的,为什么会相同呢?b1与b2的空间地址又为什么不相同了呢?
实际上对于第一与第二行代码,java在编译期做了优化,实际上执行的代码如下
Integer a1 = = Integer.valueOf(10);
那么为什么使用valueOf方法创建Integer对象时a1与a2的空间地址是相同的而b1与b2的空间地址又不同了呢?下图为valueOf方法的源码
从图中可以看到对不同的值会采用不同的创建方式,这一切似乎都与IntegerCache这个对象有关,cache为缓存的意思,不难猜出如果符合if中的条件则从缓存中获取一个对象,不符合则会new一个对象.
进入到类IntegerCache中
private static class IntegerCache { //IntegerCache.low的值为-128,被final修饰表示必须赋值且赋值后便不可再次更改 static final int low = -128; //high值虽也被final修饰但并未赋初值,意味着要在后面赋初值 static final int high; //用来存储缓存的Integer对象 static final Integer cache[]; static { int h = 127; //从虚拟机配置中获取配置"java.lang.Integer.IntegerCache.high"的值,可以自己修改虚拟机配置,默认没有该条配置 String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { //将获取的String配置值转为int int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); //配置的值若超过int类型能表示的最大值,肯定是不行的,同时也是因为缓存的对象都是存在了数组中而数组的大小也是有上线的,超过数组最大上限就缓存不下了 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; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); assert IntegerCache.high >= 127; } private IntegerCache() {} }
综上可以看出在不修改虚拟机配置的情况下,Integer会在第一次调用valueOf方法时将-128与127的Integer对象进行缓存.所有使用valueOf获取的Integer对象若在范围-128~127则都为缓存中的同一对象,而不在范围内的值则会重新new一个Integer对象.回过头再看看开始的代码输出,是否跟预想的结果一致了呢
比较Integer与Integer的大小
若想比较Integer与Integer的大小,使用equals比较即可
再来看看下面代码的输出
Integer a1 = new Integer(100); int a2 = 100; Integer a3 = new Integer(100); //当一个基本类型和一个包装类型比较时,包装类型会被自动拆包进行比较 System.out.println(a1 == a2);//true //equals方法内部调用了intValue方法,该方法会返回Integer对象中使用int修饰的value值,这个过程就是所谓的拆包 System.out.println(a1 == a3);//false System.out.println(a1.equals(a3));//true
以上就是java基础之Integer与int类型输出示例解析的详细内容,更多关于java类型Integer int的资料请关注脚本之家其它相关文章!