牛骨文教育服务平台(让学习变的简单)
博文笔记

经典String str = new String("abc")内存分配问题

创建时间:2017-05-27 投稿人: 浏览次数:1020
String str = new String("abc");

首先将这行代码分成String str、=、”abc”和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给 它,显然也没有创建对象;现在只剩下new String(“abc”)了。先看一下new String()构造函数:

 public String(String original) {
    // other code
 }

我们是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。但是发现该构造函数的参数是一个String类型的,我们要知道String本身就是一个对象。而该对象正是“abc”。

所以得出结论,这行代码一共创建了两个对象,一个是new String(),一个是“abc”;

该行代码内存分配问题:

str 是创建了一个引用,它是存放在栈内存中的。
new String 是放在堆内存中的,这个不用多说,用了new关键字,肯定在堆中;
abc 这个其实应该是在常量池中的,常量池是在jvm的方法区里面,也有人叫做“永久代”,不属于堆也不属于栈,但是在jdk1.7中已经把常量池移到堆内存中去了,所以这里的“abc”是在堆内存中。jdk1.8将移除永久代。

踏实一些,不要着急,你想要的,岁月都会给你。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。