String s1 = new String("abc")到底创建了几个对象?底层原理是什么?

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的)加载在堆空间中。

方法区:类的加载信息、常量池、静态域

发布了1 篇原创文章 · 获赞 0 · 访问量 11

猜你喜欢

转载自blog.csdn.net/karry132/article/details/105138517