String s1 = new String(“abc”)到底创建了几个对象?底层原理是什么?
要想充分了解创建了几个对象,我们需要了解JVM底层原理,String s1 = new String("abc")
分别在栈,堆,常量池的位置。
- 在JDK1.6即以前,常量池位于JVM的方法区中。(为了便于区分,主要讲1.6)
- 在JDK1.7即以后,常量池放在堆中。
-
String s = new String("abc");方式创建对象,在内存中创建了几个对象? 解析:两个:一个是堆空间中new结构 一个是char[]对应的常量池中的数据:"abc" String s = "abc";方式创建对象,在内存中创建了几个对象? 解析:一个是char[]对应的常量池中的数据:"abc" 详细解释如下:
1.java.lang.String类的使用说明
1.String声明为final的,不可被继承
2.String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小
3.String内部定义了final char[] value用于存储字符串数据
4.通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中)。
5.字符串常量池中是不会存储相同内容(使用String类的equals()比较(重写过),返回true)的字符串的。
2.String s1 = new String("abc")
内存结构图
3.String s1 = "abc"
与 String s1 = new String("abc")
区别
区别:String str1 = "abc"
直接str1存储的是常量池中的地址值
String str2 = new String("abc")
str2
存储的是在堆中的 new String()
的地址值
new String()
存放的是跟str1
相同指向的常量池的地址值。
4.栈、堆、方法区在创建对象时存储内容总结
栈:一般存放局部变量,正在运行的方法等压入栈中,还存放创建对象时的引用变量例如 String str1 = "abc";
中的str1
堆: 我们将new出来的结构(比如:数组、对象)加载在对空间中。
补充:对象的属性(非static的)加载在堆空间中。
方法区:类的加载信息、常量池、静态域