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

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

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值