有一个关于 Java 中 Stringz 实例池的简单问题
如果我遇到这样的情况: 场景一:
String s1 = "aaa";
String s2 = new String("aaa");
然后翻转 场景2:
String s1 = new String("aaa");
String s2 = "aaa";
在每种情况下,在字符串池和堆中创建了多少个对象? 我假设两者都会创建相同数量的对象(2 个对象 - 一个用于字符串池中每个场景中的两行的单个“aaa”,一个用于新运算符)。 我在 iview 中被告知这是不正确的 - 我很好奇我的理解有什么问题?
最佳答案
正如您在采访中所说,无论哪种情况,答案都是堆中 1 个实例,字符串池中 1 个实例。
字符串可以驻留在两个空间:堆和存储临时字符串的永久代。
String 构造函数在堆中创建一个 String。字符串文字是在永久代的字符串池中创建的。可以使用 String.intern()
方法将堆中的字符串移动到字符串池中。它会驻留字符串(即,确定对池中相等字符串的引用,或者在其中创建一个相等字符串(如果还没有))并返回对驻留字符串的引用。
编辑:要检查我的回答,请添加 System.out.println(s1 == s2);
作为每个示例的第三行。在这两种情况下都会打印 false,证明两个对象具有不同的内存地址。
关于java - 正在创建多少个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10045147/