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

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

1:常量池(constant pool),就是存放常量的池子(为什么会有常量池这种东西存在我在这里不做阐述,可以看看java虚拟机内存分析)。


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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容