java 栈 堆 常量池 的理解

java常量池不在堆中也不在栈来中,是独立的内存空间管理。

 1. 栈:存放基本类型的变量和对象的引用,但对象本身不存放在源栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

 2. 堆:存放所有new出来的对象。

 3. 常量池:存放字符串常量和基本类型常量(public static final)和5种整型的包装类。

Byte,Short,Integer,Long,Character这5种整型的包装类只是在对应值-128到127之间时才能存放在常量池 也就是说

   Long a=(long) 123;//存于常量池中
   Long b=(long) 123;//直接从常量池中去获取
   System.out.println(a==b);//true

 

对于字符串:其对对象象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的如String a="abc")的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

猜你喜欢

转载自www.cnblogs.com/atsong/p/12980854.html