基本数据类型由于长度固定,且需要的空间比较少。所以直接存储在栈中;而对象比较大,所以栈中只存储一个4btye的引用地址(逻辑地址)。
java中对string对象特殊对待,所以在heap区域分成了两块:
一块是String constant pool,用于存储java字符串常量对象(确切的说应该属于方法区)。
另一块用于存储普通对象及字符串对象。
eg:
@String a="abc"; JVM会在String constant pool(常量池)中寻找是否已经存在"abc"常量,如果有"abc"常量,则返回。如果没有,则在常量池中创建该常量,并且将此常量的引用返回给String a;
@String b = new String(“abc”),JVM只在堆中创建字符串对象“abc”。不会在常量池中创建。
虽然new String()方法并不会把"abc"加入到String constant pool 中,但是可以手动调用intern()将字符串对象加入到String constant pool中。