• int 与 Integer的区别


    int和Integer对象的比较

    (1).Integer是int的包装类;int是基本数据类型;Integer1和String一样都是别人封装的类,都是引用数据类型。

    (2).Integer变量必须实例化后才能使用,int变量不需要;

        例:ArrayList<Integer> a = new ArrayList<>();

    (3).Integer实际是对象的引用,指向new的Integer对象,int 是直接存储数据值;

    (4).Integer的默认值是null;int的默认值是0。

    Integer变量和Integer变量、Integer变量和int变量的比较:

      (1)由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址值不同)。

    Integer i= new Integer(100);

    Integer j = new Interger(100);

    System.out.println(i == j);//false

    Integer和Integer对象内存图解

    (2)Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true(因为包装类和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个变量值的比较);

    Integer i = new Integer(100);

    int j =100;

    System.out.println(i ==j);//true

    (3)非new生成的Integer变量和new Integer()生成的变量比较时,结果为fals。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量执行堆中新建的对象,两者在内存中的地址值不同)

    Integer i = new Integer(100);
    Integer j = 100;
    System.out.print(i == j); //false

    (4)对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

    Integer i = 100;

    Integer j = 100;

    System.out.print(i == j); //true

    Integer在进行自动拆装箱(jdk1.5之后)的时候,编译器会使用Integer.valueOf()来构建Integer实例;在valueOf()构建Integer实例的过程中是通过IntegerCache来实现的,IntegerCache值的范围是-128到1237(byte)。在这个范围内是直接返回数值,这个数值是放置于java内存的栈区的,不需要生成对象。

    Integer i = 128;

    Integer j = 128;

    System.out.print(i == j); //false

    而当值大于127的时候就ew Integer(i)生成了新的对象,而生成的对象防止在堆区,也就是说指向了两个不同的内存地址。java API中对Integer类型的valueOf的定义如下,对于-128到127的数,会进行缓存,比如Integer i= 127时,会将127进行缓存,下次再写Integer j = 127是,就会直接从缓存中取值,就不会new了。

  • 相关阅读:
    javascript高级知识点——函数原型
    javascript高级知识点——临时作用域
    javascript中的部分函数应用
    javascript高级知识点——闭包
    使用HIPQTools播放视频—记录
    wpa_suppliant编译小结
    内存溢出和内存泄漏
    C代码规范
    Makefiel(一)
    Lua语言
  • 原文地址:https://www.cnblogs.com/lk625/p/14017805.html
Copyright © 2020-2023  润新知