在回答这个问题之前,先带大家了解几个知识点:
- Java内存分配总共分为五个区,分别是:方法区、栈内存、堆内存、本地方法栈、内存区(加粗的为常用)
- 方法区:主要存储的是.java程序编译之后的.class文件
- 栈内存:方法运行时是在栈内存中运行、以及各种变量存储的地方
- 堆内存:主要有字符串常量池,包括new关键词出来的对象也在堆内存中,系统并为其在此分配地址
有了以上的知识储备我们来看下面这段代码:
public static Demo{
public static void main(String[] args){
String str=new string("abc");
}
}
- 先将编译之后的class文件放入方法区中
- 然后运行main方法,此时main方法存储在栈内存中
- 其实这里的
String str=new string("abc");
可以理解成
String str1="abc";
String str=new String(str1);
- 其实该代码段运行的时候,就是先在堆内存中的字符串常量池创建一个字符串常量str1对象,然后其作为String函数的参数去new一个新的对象,此时就会在堆内存中产生str对象,并为其分配空间和地址。
综上所述,该代码段总共产生了2个对象,而不是一个昂!
特殊情况:如果堆内存中的字符串常量池中本身就存在“abc”字符串,那么此段代码就只产生了一个对象。
如果你认为我说的对的话,还请麻烦点个赞吧!ღ( ´・ᴗ・` )