关于创建String对象的方法的理解

关于创建String对象的方法的理解

http://img1.sycdn.imooc.com//climg/5d4b8a79000173b410050424.jpg

1. String s1 = "imooc";  
   在编译阶段会在内存的字符串常量池中先去找有没有一个 "imocc" 的字符串常量,因为常量池中相同
   的字符串只会有一个,所以如果已经有 "imocc" 这个字符串常量就让s1指向这个常量,如果没有就在
   常量池中创建一个 "imooc" 常量。
2. String s2  = new String(); String s3 = new String("imooc"); 
   因为new Sring()的话它每次都会在堆中新建一个对象,不管这个对象的值是否相同。
   String s2 = new String("imooc");  String s3 = new String("imooc");
   所以 s2 == s3 返回false, 但是因为String已经重写了Object的equlse()方法,
   所以 s2.equlse(s3)返回的true。

3. Sring s4 = new String(); String s5 = new String("");
   我想问一下,s4 表示创建一个空字符串对象,
               s5 表示的是不是也是创建一个空字符串对象
    他们在new String 对象的时候,堆栈里有没有什么不一样的呢?


正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,可以这样理解:

1、Sring s4 = new String();表示创建一个s4对象,Java会隐示的为它初始化为长度为0的字符串

 String s5 = new String("");表示创建一个s5对象,并手动的初始化为长度为0的字符串

所以equals进行比较返回为true,但是都是new的对象,但在内存中的地址不同,所以‘==’比较返回false

2、在堆中的情况:

因为都是new的对象,所以每次都会在堆中新建对象的。

String s5 = new String(""):会产生两个对象,在类加载时会创建一个""对象放到字符串常量池中,在运行时会从常量池中赋值一份到堆中,并且将堆中这个对象的引用交给s5持有。

Sring s4 = new String();与new String("")堆中创建的方式一样的哦~同样会产生两个对象,在类加载时会创建一个""对象放到字符串常量池中,在运行时会从常量池中赋值一份到堆中,并且将堆中这个对象的引用交给s4持有。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • jia_蛙 提问者 #1
    也就是说 不管你创建对象的时候,构造方法带不带参,它都会创建两个对象,一个是在【类加载】时创建放到字符串常量池中,另一个则是在程序【运行时】创建一个对象放在堆中,但是它的值是从常量池赋值而来的。 -------------------- s5 和 s4 产生的对象我可以理解都为 null吗? 他们都没有值,只不过在堆中的地址值不同而已,但是他们从常量池中赋的值都是空的 null。
    2019-08-08 14:11:57
  • jia_蛙 提问者 #2
    说错了 ,我是想问 s5 和 s4常量池对象的值可以理解为null吗,因为是空字符串,没有值,只不过在堆中的地址值不同而已,但是他们从常量池中赋的值都是空的 null
    2019-08-08 14:15:09
  • 好帮手慕酷酷 回复 提问者 jia_蛙 #3
    同学你好,s4和s5是不能理解为null的,null是没有地址引用的,是没有这个对象的~而这里s4和s5得地址是有值的哦~所以s4 和s5应该理解为它们是有值的,但是它们的长度为0哦~ 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!​
    2019-08-08 14:22:12
BraveSong灬 2019-08-08 11:05:55

就是new的时候在堆里开辟了2块空间每个空间都有一个16进制的编号表示地址,a和b就分别指向这两个不同的地址,调用方法时定义的a.b实在里栈开辟空间存放ab指向的地址

  • 提问者 jia_蛙 #1
    那 new String() 和 new String(""),在堆中存放16进制的编号地址的空间 有大小嘛? 还是说堆中开辟都是相同固定的空间,只是空间的地址值不同,然后 a 和 b 分别指向这两个地址?
    2019-08-08 12:04:52
提问者 jia_蛙 2019-08-08 10:59:29
 String a = new String();
 String b = new String("");
 System.out.println(a == b);  //false
 System.out.println(a.equals(b)); //ture
 
 因为 在堆中创建创建的对象的地址值不同,所以 a==b 返回false
 因为他们都没有值 所以 a.equalse(b)返回true
 但他们在创建的时候,在堆里分别是个什么情况啊?


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师