Java 正在创建多少个对象?
有一个关于Java中Stringz实例池的简单问题 如果我遇到这样的情况: 情景1:Java 正在创建多少个对象?,java,string,object,Java,String,Object,有一个关于Java中Stringz实例池的简单问题 如果我遇到这样的情况: 情景1: String s1 = "aaa"; String s2 = new String("aaa"); 然后翻了个身 情景2: String s1 = new String("aaa"); String s2 = "aaa"; 在每种情况下-在字符串池和堆中创建了多少个对象? 我假设两者都会创建相同数量的对象(2个对象-字符串池中每个场景中的两行都有一个“aaa”,新操作符有一个)。 我在一次i
String s1 = "aaa";
String s2 = new String("aaa");
然后翻了个身
情景2:
String s1 = new String("aaa");
String s2 = "aaa";
在每种情况下-在字符串池和堆中创建了多少个对象?
我假设两者都会创建相同数量的对象(2个对象-字符串池中每个场景中的两行都有一个“aaa”,新操作符有一个)。
我在一次iview中被告知这是不正确的-我很好奇我的理解有什么问题?文本
“aaa”
的字符串是在类加载时创建和合并的,因此在执行代码的两行代码时只创建一个新字符串
需要明确的是:两个示例在执行时只创建一个新的字符串对象。文本是在第一次使用包含字符串“aaa”的类时创建的
答案是堆中有1个实例,字符串池中有1个实例,正如您在访谈中所说的那样 字符串可以驻留在两个空间:heap和perm gen,其中存储了插入的字符串 字符串构造函数在堆中创建一个字符串。字符串文字是在永久生成中的字符串池中创建的。堆中的字符串可以通过方法
String.intern()
移动到字符串池中,该方法对字符串进行实习生(即,确定对池中相等字符串的引用或在池中创建相等字符串,如果还没有),并返回对实习生字符串的引用
编辑:为了检查我的回答,添加
System.out.println(s1==s2)代码>作为每个示例的第三行。在这两种情况下,它都会打印为false,证明这两个对象具有不同的内存地址。从技术上讲,您可能是对的,但您能否更详细地解释一下具体在什么时候发生的情况?您是指在这两种情况下吗?就像迈克尔说的那样,你能详细解释一下吗?事实上,这是正确的解释:请参考这次投票,以获得解释清楚的答案
class FooBar{
void foo(){
String s1 = "aaa";//the literal already exists
String s2 = new String("aaa");//creates string for s2
}
void bar(){
String s1 = new String("aaa"); //creates string for s1
String s2 = "aaa";//the literal already exists
}
}
class Test{
public void main(String... args){
...
//first time class FooBar used in program, class with literals loaded
FooBar fb = new FooBar();
//creates one string object, the literal is already loaded
fb.bar();
//also creates one string object, the literal is already loaded
fb.foo();
}
}