java基础之Integer与int类型输出示例解析

 更新时间:2023年06月30日 14:19:54   作者: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的资料请关注脚本之家其它相关文章!

相关文章

  • Java递归实现字符串全排列与全组合

    Java递归实现字符串全排列与全组合

    这篇文章主要为大家详细介绍了Java递归实现字符串全排列与全组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • java实现希尔排序算法

    java实现希尔排序算法

    希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进,是将整个无序列分割成若干小的子序列分别进行插入排序,希尔排序并不稳定。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
    2015-04-04
  • JavaWeb中Struts2拦截器深入分析(一)

    JavaWeb中Struts2拦截器深入分析(一)

    这篇文章主要为大家详细介绍了JavaWeb中Struts2拦截器的功能,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • SpringBoot如何整合nacos详解

    SpringBoot如何整合nacos详解

    今天教各位小伙伴SpringBoot是如何整合nacos的,文中有非常详细的代码示例,对正在学习Java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-06-06
  • java调用shell脚本及注意事项说明

    java调用shell脚本及注意事项说明

    这篇文章主要介绍了java调用shell脚本及注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring Cache监控配置与使用规范的建议

    Spring Cache监控配置与使用规范的建议

    这篇文章主要介绍了Spring Cache监控配置与使用规范的建议,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringBoot + layui 框架实现一周免登陆功能示例详解

    SpringBoot + layui 框架实现一周免登陆功能示例详解

    这篇文章主要介绍了SpringBoot+layui框架实现一周免登陆功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • spring boot 注入 property的三种方式(推荐)

    spring boot 注入 property的三种方式(推荐)

    这篇文章主要介绍了spring boot 注入 property的三种方式,需要的朋友可以参考下
    2017-07-07
  • 如何解决Mybatis-plus中@TableLogic注解失效问题

    如何解决Mybatis-plus中@TableLogic注解失效问题

    这篇文章主要介绍了如何解决Mybatis-plus中@TableLogic注解失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java基于mongodb实现分布式锁的示例代码

    java基于mongodb实现分布式锁的示例代码

    本文主要介绍了java基于mongodb实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论