zoukankan      html  css  js  c++  java
  • Java Integer常量池——IntegerCache内部类

    个人理解,不喜勿喷,欢迎指正。

    首先看下面这段代码,猜一下输出结果是什么

    1         Integer a = 10;
    2         Integer b = 10;
    3         System.out.println(a == b);
    4         a = 100;
    5         b = 100;
    6         System.out.println(a == b);
    7         a = 1000;
    8         b = 1000;
    9         System.out.println(a == b);    

    你以为是true true true 或者是false false false吗?

    天真,看下图

    你没看错,就是这么坑!

    按理说,Integer是封装类型,结果应该是false false false。

    那么我们看下这段代码到底是怎样执行的,会出现这种结果

    首先赋值时,先调用了下面的函数,这里出现了个奇怪的东西,IntegerCache,看起来问题就在这里

    接下来看一下IntegerCache到底是个什么东东,下面是该类的源码

    在源码中我们看到这个类有一个[-128,127]的Integer数组cache(这个数组的上限看起来好像是可以变的,但是我没有rt的源码包,所以不知道具体细节),所以在看Integer赋值的代码,就很清晰了

     这里判断你赋值的数大小是否被包含在IntegerCache的cache数组内

    如果在,就返回该对象的引用,因而小于等于127大于等于-128的数,通过==比较可以得出结果为true,因为引用相同,而超出范围的数就调用Integer的构造函数重新创建一个Integer对象因而虽然值相同但是由于引用不同而得出结果为false

    所以判断对象的值是否相同时还是使用a.equals(b)

  • 相关阅读:
    (6)Lua 模块与包
    (3)Lua 迭代器与迭代函数
    (二)miller指导查看主控板寄存器操作
    (一)mtg3000常见操作
    (三)NAND flash和NOR flash的区别详解
    (八)shell中的循环结构
    (七)shell编程学习
    (六)动手写第一个shell
    (五)uboot移植补基础之shell
    (四)ubuntu学习前传—uboot中对Flash和DDR的管理
  • 原文地址:https://www.cnblogs.com/one-riddle/p/7495253.html
Copyright © 2011-2022 走看看