老师,我对String s1 = new String("test");创建了几个对象还有一点不是很清楚,望老师解答
来源:13-4 角色用户模块交互功能实现

慕斯5332939
2018-07-25
首先,老师在给上面同学回答这个问题,给出了一个链接,我看了https://www.cnblogs.com/dangzhenjiuhao/p/4585389.html
我对其中不是很清楚的语句我用红色标出来了,
其次,我说出我的理解,有什么不对的地方,希望指出
a.s1创建了两个对象,这个我可以理解。
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回答
-
你好,这明显是看多了,越看越乱。先说第一个问题,s2怎么可能不创建一个对象呢(你自己图里还画了一条线),他本身复用不了s1的,因为人家s1是通过new String出来的,其他的和都没关系,就像之后的s5通过new String一样,完全生成一个新的对象,只是里面存储的传是已经存在的,因此只创建一个class就可以了,而s3可以直接复用s2的,因此s3并不创建对象。
其实这里本质就是你对s2="test"的理解,这里"test"已经是一个常量了,s2持有的是"test"的地址,当执行s3="test"时,发现这个常量已经存在了,直接返回的就是之前s2的地址,因此你看到的那些true,是因为他们的内存地址确实都是相同的
012018-07-27
相似问题