String str = new String(“abc“)究竟创建了几个对象?

本文详细解析了Java中创建String对象的两种方式:直接赋值与使用new关键字。探讨了常量池的概念,说明了字符串常量池在方法区的存储位置。通过实例分析了`str1==str2`和`str1==str3`的比较结果,揭示了字符串拼接的内存行为。同时,深入讲解了字符串对象的内存分配和字符串池的工作原理。
摘要由CSDN通过智能技术生成

先给出答案:两个。(如果原来常量池中没有"abc")

 

String是一个特殊的包装类数据。即可以用String str = new String("abc");的形式来创建,也可以用String str = "abc";的形式来创建

String str = "abc"创建对象的过程

 

  1. 首先在常量池中查找是否存在内容为"abc"字符串对象
  2. 如果不存在则在常量池中创建"abc",并让str引用该对象
  3. 如果存在则直接让str引用该对象


"abc"是怎么保存,保存在哪?

常量池属于类信息的一部分,而类信息反映到JVM内存模型中是对应存在于JVM内存模型的方法区,也就是说这个类信息 中的常量池概念是存在于在方法区中。

而方法区是在JVM内存模型中的堆中由JVM来分配的,所以"abc"可以说存在于堆中(而有些资料,为了把方法区的 堆区别于JVM的堆,把方法区称为栈)。一般这种情况下,"abc"在编译时就被写入字节码中,所以class被加载时,JVM就为"abc"在常量池中 分配内存,所以和静态区差不多。


String str = new String("abc")创建实例的过程

 

  1. 首先在堆中(不是常量池)创建一个指定的对象"abc",并让str引用指向该对象
  2. 在字符串常量池中查看,是否存在内容为"abc"字符串对象
  3. 若存在,则将new出来的字符串对象与字符串常量池中的对象联系起来
  4. 若不存在,则在字符串常量池中创建一个内容为"abc"的字符串对象,并将堆中的对象与之联系起来

 

我们来看以下两个例子加深理解:

String str1 = "abc"; String str2 = "ab" + "c"; str1==str2是true吗?

答案:是。因为String str2 = "ab" + "c"会查找常量池中时候存在内容为"abc"字符串对象,如存在则直接让str2引用该对象,显然String str1 = "abc"的时候,上面说了,会在常量池中创建"abc"对象,所以str1引用该对象,str2也引用该对象,所以str1==str2

 

String str1 = "abc"; String str2 = "ab"; String str3 = str2 + "c"; str1==str3是false吗?

答案:是。因为String str3 = str2 + "c"涉及到变量(不全是常量)的相加,所以会生成新的对象,其内部实现是先new一个StringBuilder,然后 append(str2),append("c");然后让str3引用toString()返回的对象

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值