在这里,我首先讲一下常量池的概念和在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:案例:
demo6:jvm中常量池位置
1.7之前,存在于方法区。
1.7,存在于永久代
1.7之后,存在于元空间,就是pc直接内存,因为1.8删除了永久代。
7:equals()方法
直接看Integer重写Object的equals方法,直接比较的具体指是否相等。值相等即为true。
网友评论