寄存器,栈,堆,其他

就速度来说,有如下关系: 

    寄存器 > 栈 >堆 >其他

这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

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

如以下代码:

Java代码  

String s1 = "china";  

String s2 = "china";  

String s3 = "china";  

String ss1 = new String("china");  

String ss2 = new String("china");  

String ss3 = new String("china");  

 

对于通过 new 产生一个字符串(假设为 ”china” )时,会先去常量池中查找是否已经有了 ”china” 对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此 ”china” 对象的拷贝对象。

这也就是有道面试题:

 String s = new String(“xyz”); 产生几个对象?一个或两个,如果常量池中原来没有 ”xyz”, 就是两个。


转载自:https://blog.csdn.net/u012031380/article/details/54981472

 

 

对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

猜你喜欢

转载自blog.csdn.net/HD243608836/article/details/79966025