今天看到一道面试题String string = new String("abc");到底创建了几个对象?

百度了很多资料,看到的答案都是含糊其辞的,所以打算自己来记录一下。

首先先介绍一下JVM的内存模型:

   方法区(Method Area):主要存放类定义、常量、编译后的代码、静态变量等

   堆(Heap):new创建的对象都在堆上,在JVM内存中占比极大,是GC()垃圾回收的主要阵地

   栈(Java Stack):栈也称虚拟机栈,当JVM在执行方法时,会在此区域中创建一个栈帧来存放方法的各种信息,比如返回值,局部变量表和各种对象引用等,方法开始执行前就先创建栈帧入栈,执行完成后出栈

   本地方法栈(Native Method Stack):和虚拟机栈类似,不过区别是专门提供给Native即本地方法使用的

   程序计数器(Program Counter Register):记录当前程序执行的行数,占用很小的内存空间

经典面试题 String string = new String("abc");到底创建了几个对象

new String("abc")这一句是在堆内存上创建abc

String string是在栈中创建string对象引用

然后将栈中的引用指向堆内存中的abc,这就完成了String string = new String("abc")的执行。

在堆中,相同的值可以存在多份,即String s1 = new String("abc"); String s2 = new String("abc"); s1 == s2, 返回的是false。

 

与这道题相似的一道题是String string = “abc”;创建了几个对象。

"abc"这一句是在常量池中创建了abc

String string也是在栈中创建string对象引用

然后将栈中的引用指向常量池中的abc,这就完成了String string = "abc"的执行。

在常量池中,相同的常量只存在一份,即String s1 = "abc"; String s2 = "abc";  s1 == s2,返回的是true。

相关文章: