老师,我对String s1 = new String("test");创建了几个对象还有一点不是很清楚,望老师解答

来源:13-4 角色用户模块交互功能实现

慕斯5332939

2018-07-25

首先,老师在给上面同学回答这个问题,给出了一个链接,我看了https://www.cnblogs.com/dangzhenjiuhao/p/4585389.html

我对其中不是很清楚的语句我用红色标出来了,

http://img.mukewang.com/szimg/5b57e9590001882c05160440.jpg

其次,我说出我的理解,有什么不对的地方,希望指出

a.s1创建了两个对象,这个我可以理解。

http://img.mukewang.com/szimg/5b57f1bb00016a9507890537.jpg

      S1在创建的时候遇到了new ,所以现在堆内存中创建一个对象,然后在去String池 中找是否有test这个 常量,发现没找到,所以在String 池中创建了一个叫做test的常量。所以“test”(创建)-->(“test地址”)堆内存地址-->(堆内存中的地址赋给s1)s1,所以s1创建了2个对象。

       可是我就不明白了String s2 = "test";不是没创建对象吗?可是那个链接里面说创建了一个。我是这么理解的:s2="test",它首先会去String池中找是否有test这个常量,发现有这个test常量(因为String s1 = new String("test")),所以它并不会创建一个对象。

    第二个疑问,System.out.println(s2=="test");// true s2=="test"很明显true。不是特别有把握,不知道这样理解是否正确。s2=="test",在判断是否相等的时候,跟s2="test"(一个=原理差不多)都是把这个final 修饰的test常量的地址赋给了s2,所以s2=="test"也是把test里面的地址和s2中的引用地址是否一致,要是这样就说得通了

写回答

1回答

Jimin

2018-07-25

你好,这明显是看多了,越看越乱。先说第一个问题,s2怎么可能不创建一个对象呢(你自己图里还画了一条线),他本身复用不了s1的,因为人家s1是通过new String出来的,其他的和都没关系,就像之后的s5通过new String一样,完全生成一个新的对象,只是里面存储的传是已经存在的,因此只创建一个class就可以了,而s3可以直接复用s2的,因此s3并不创建对象。

其实这里本质就是你对s2="test"的理解,这里"test"已经是一个常量了,s2持有的是"test"的地址,当执行s3="test"时,发现这个常量已经存在了,直接返回的就是之前s2的地址,因此你看到的那些true,是因为他们的内存地址确实都是相同的

0
1
慕斯5332939
非常感谢!
2018-07-27
共1条回复

Java开发企业级权限管理系统

源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术

2261 学习 · 1347 问题

查看课程