• Java Integer 与 int 深刻理解


      今天在做Object 自动转为Integer 类型之后的判断,遇到一个不理解的点,当数值超过127之后,两个数值相同的Object 对象用 == 判断的结果是false。

     1      Object a = 128;
     2         Object b = 128;
     3         
     4         System.out.println(a.getClass().getName());
     5         System.out.println(b.getClass().getName());
     6         System.out.println(a==b);
     7         
     8         
     9         Object a1 = 127;
    10         Object b1 = 127;
    11         
    12         System.out.println(a1.getClass().getName());
    13         System.out.println(b1.getClass().getName());
    14         System.out.println(a1==b1);
    15         
    16         int a2 = 128;
    17         int b2 = 128;
    18         
    19         System.out.println(a2==b2);

    结果:

    false
    true
    true

     

    之前隐约记得数值在 -128 与 127之间时,Integer 对象会特别处理,但是具体怎么处理的忘记了,网上查了些资料终于明白背后的设计原理了。

     

    ① Java 中的数据类型分为基本数据类型和引用数据类型

      int是基本数据类型,Integer是引用数据类型;

      Ingeter是int的包装类,int的初值为0,Ingeter的初值为null;

      ② 自动装箱和拆箱

      从Java5.0版本以后加入了autoboxing功能,自动拆箱装箱是依靠JDK的编译器在编译期的预处理工作。

      A. 自动装箱:将基本数据类型封装为对象类型,成为一个对象以后就可以调用对象所声明的所有的方法。

       Integer inA = 127;
        //以上的声明就是用到了自动的装箱:解析为
        Integer inA = new Integer(127);

      B. 自动拆箱:将对象重新转化为基本数据类型。

      //装箱
       Integer inB = 128;
       //拆箱
       int inC = inB;

      C. 自动拆箱很典型的用法就是在进行运算的时候:因为对象不能直接进行运算,需要转化为基本数据类型后才能进行加减乘除。

    Integer inD = 128;
    System.out.println(inD--);

      

      ③ 回到我遇到的问题:为什么数值在 -128 与 127之间时,两个Integer 对象是否相等可以用 ==来判断,但是这个范围之外的就不能了呢?

    这是因为Java对于Integer 与int 的自动装箱与拆箱的设计,是一种模式:享元模式(flyweight),为了加大对简单数字的重利用,Java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。而如果超过了这之间的值,被装箱后的Integer 对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;

    以上的现象是由于使用了自动装箱所引起的,如果你没有使用自动装箱,而是跟一般类一样,用new来进行实例化,就会每次new就都一个新的对象;这个的自动装箱拆箱不仅在基本数据类型中有应用,在String类中也有应用。

     

    ④ 包装类

    所有基本类型都有一个与之对应的类,即包装类;是不可变类;包装类是final的,不能定义他们的子类。

    基本数据类型

    包装类

    byte

    java.lang.Byte

    boolean

    java.lang.Boolean

    short

    java.lang.Short

    char

    java.lang.Character

    int

    java.lang.Integer

    long

    java.lang.Long

    float

    java.lang.Float

    double

    java.lang.Double

     

  • 相关阅读:
    for,foreach,$.each()跳出循环的比较
    十大经典排序算法
    沙箱模式以及其使用到的IIFE
    绝对路径和相对路径的区别
    必备的JS调试技巧汇总
    通过.frm表结构和.ibd文件恢复数据
    Jenkins使用QQ邮箱构建邮件提醒服务
    windows常用命令积累
    7.手机屏幕分辨率
    6.移动端App安装包的测试用例
  • 原文地址:https://www.cnblogs.com/Latiny/p/8432683.html
Copyright © 2020-2023  润新知