动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网

String创建对象面试问题

程序员_HelloWorld

2018.08.07

String str = new String("abc");

创建了几个对象?

添加回答

回答(2)

代码小兵1350

String str = new String("abc");

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

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将移除永久代。

时间:08-07 20:30 查看回复 (1) 回复 5 0 举报

Winson

再贴一个内存图,就完美了

时间:08-26 17:11 回复 举报

这人

常量池中存在   :创建了1个对象

                                     即new String()在堆中的内存地址

常量池中不存在:创建了2个对象

                                     即new String()创建在堆中变量str的内存地址

                                     常量池中的字变量 “abc”

 

时间:09-02 13:43 查看回复 (0) 回复 0 0 举报

回复