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的资料请关注脚本之家其它相关文章!

相关文章

  • 解析springcloud中的Hystrix

    解析springcloud中的Hystrix

    Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。这篇文章主要介绍了springcloud中的Hystrix,需要的朋友可以参考下
    2020-10-10
  • Java单利模式与多线程总结归纳

    Java单利模式与多线程总结归纳

    这篇文章主要介绍了Java单利模式与多线程总结归纳 的相关资料,需要的朋友可以参考下
    2016-03-03
  • SpringBoot集成screw实现数据库文档生成的代码示例

    SpringBoot集成screw实现数据库文档生成的代码示例

    数据库设计文档是项目技术文档的重要组成部分,Screw 是一款开源的数据库文档生成工具,它支持多种数据库类型,并能生成丰富格式的文档,本文将通过一个实际的例子,展示如何使用 Spring Boot 集成 Screw 生成数据库设计文档
    2024-07-07
  • java递归读取目录下所有文件的方法

    java递归读取目录下所有文件的方法

    这篇文章主要为大家详细介绍了java递归读取目录下所有文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Springboot的启动原理详细解读

    Springboot的启动原理详细解读

    这篇文章主要介绍了Springboot的启动原理详细解读,springboot项目一般都是打包成jar包直接运行main方法启动,当然也可以跟传统的项目一样打包war包放在tomcat里面启动.那么springboot怎么直接通过main方法启动呢,需要的朋友可以参考下
    2023-11-11
  • Java 实战范例之校园二手市场系统的实现

    Java 实战范例之校园二手市场系统的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+mysql+maven+tomcat实现一个校园二手市场系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Spring为什么不推荐使用@Autowired注解详析

    Spring为什么不推荐使用@Autowired注解详析

    @Autowired 注解的主要功能就是完成自动注入,使用也非常简单,但这篇文章主要给大家介绍了关于Spring为什么不推荐使用@Autowired注解的相关资料,需要的朋友可以参考下
    2021-11-11
  • IntelliJ IDEA修改编码的方法步骤

    IntelliJ IDEA修改编码的方法步骤

    这篇文章主要介绍了IntelliJ IDEA修改编码的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • java中MultipartFile类型转为File类型的4种方法

    java中MultipartFile类型转为File类型的4种方法

    Spring提供了一个MultipartFile接口来处理文件上传,但有时候我们需要将MultipartFile转换为File来进行一些特定的操作,比如保存文件到本地或者进行文件的处理等,这篇文章主要给大家介绍了关于java中MultipartFile类型转为File类型的4种方法,需要的朋友可以参考下
    2024-09-09
  • Spring Event事件通知机制解读

    Spring Event事件通知机制解读

    这篇文章主要介绍了Spring Event事件通知机制解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论