美文网首页Java 杂谈javaJava
int和Integer的区别(equals和==)

int和Integer的区别(equals和==)

作者: yiqiquhuxi | 来源:发表于2019-06-06 16:45 被阅读123次

      在这里,我首先讲一下常量池的概念和在jvm里面内存存储情况。

    1:常量池(constant pool),指基本数据类型在初始化时候会存储在内存中一块特殊的位置,这块特殊的位置就叫做常量池(为什么会有常量池这种东西存在我在这里不做阐述)。


    2:int / Integer 在内存中的位置:首先我们举个列子:

    三种创建整型方法

    上面的三种创建整型方法大家应该再熟悉不过了,但是他们在内存中的存储位置却有着很大区别。

    int a =1 和Integer a1 =1 其实是一种形式,只不过Integer a1 =1 最终是做了拆箱,和 int a =1 是一个东西 ,这里没有用new关键字而是直接赋值,内存分析如下,首先会查找常量池中有没有该数据,如果有则直接返回引用,如果没有则在常量池中创建该数据再返回引用。

    Integer c1 =new Integer(1),内存分析如下:首先查找常量池有没有该数据,如果没有则首先在栈内存创建该引用(c1),在堆内存创建具体对象(new Integer(1)),并且在常量池中创建该对象,返回栈内存的引用;如果有则直接返回栈内存地址的引用。


    3:== 比较说明

    比较基本数据类型:值是否相等

    比较引用类型:比较引用是否相等(具体点:内存地址引用是否相同)


    4:注意点:new Integer(int num) 和int 比较会做强制转换。用new形式创建Integer和int比较,会将new Integer()强制转换成int类型,见下图:

    int常量 构造方法

    5:案例

    demo

    6:jvm中常量池位置

          1.7之前,存在于方法区。
          1.7,存在于永久代
          1.7之后,存在于元空间,就是pc直接内存,因为1.8删除了永久代。


    7:equals()方法
           直接看Integer重写Object的equals方法,直接比较的具体指是否相等。值相等即为true。

    相关文章

      网友评论

        本文标题:int和Integer的区别(equals和==)

        本文链接:https://www.haomeiwen.com/subject/bylijttx.html