zoukankan      html  css  js  c++  java
  • java中Integer在JDK1.6和JDK1.7中的区别

    运行下面这段代码:

    System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
    System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
    System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));

    JDK1.6输出结果:

    false
    false
    true
    

     JDk1.7输出结果:

    true
    false
    true
    

     下面来研究一下为什么会出现这种情况。

    JDk1.7中Integer源码中valueOf方法:

    第一步:

    第二步:

    第三步:

    可以发现,valueOf会返回一个Integer(整型)对象,当被处理的字符串在-128和127(包含边界)之间时,返回的对象是预先缓存的。

    可以得出:

    第一行的调用返回true,这个整型对象127是被缓存的

    第二行的调用返回false是因为128没有被缓存。

    JDk1.6中Integer源码中valueOf方法:

    第一步:

     

    第二步:

    可以发现,valueOf无论大小都会返回一个new 的 新的Integer(整型)对象,所以都不一样。

    可以得出:

    第一行的调用返回false,返回一个新的Integer(整型)对象

    第二行的调用返回false,,返回一个新的Integer(整型)对象。

    第三行的方法Integer.parseInt(String),这个方法反回的int

    对应的Integer源码如下:

    比较操作符使用了==同时等号的两边存在一个int型和一个Integer对象的引用时,Java在进行比较前会将Integer自动拆箱,所以最后进行的是int和int值之间的比较。

    即:128==128,返回true。

    小结:JDK1.7版本开始,Integer有了静态缓存,这点注意一下。

  • 相关阅读:
    20000+关注,开源两本硬核的原创电子书!
    Tail Latency学习
    Zabbix5.0 监控redis
    JAVA多线程(九) ForkJoin框架
    JAVA多线程(八) Condition源码分析
    程序员英语学习(二) 标点符号对应的英语单词汇总
    linux shell快速入门
    Ubuntu常用指令和快捷键汇总
    Win10常用快捷键汇总
    算法路漫漫(三) 荷兰国旗
  • 原文地址:https://www.cnblogs.com/zjiacun/p/6845690.html
Copyright © 2011-2022 走看看