最经在看一些面试题:
有个问题居然两种答案:String s = new String("xyz");创建了几个String Object: 1 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s
2 两个对象,一个是String Pool里的“xyx”,一个是堆里的“xyx”对象,而s仅是个引用不是对象我个人感觉第二个答案比较正确,希望大家给我个准确的答案!
有个问题居然两种答案:String s = new String("xyz");创建了几个String Object: 1 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s
2 两个对象,一个是String Pool里的“xyx”,一个是堆里的“xyx”对象,而s仅是个引用不是对象我个人感觉第二个答案比较正确,希望大家给我个准确的答案!
所以不可能既在string pool里有一个而且在所谓的堆里也有一个!
然后在串池里面有一个对象是 "xyz"
有问题~String 在pool中有,new的话会在外边再创建。1楼对的。
Stirng str2 = "abc"; 虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法.
我也对这个问题进行了些整理,如果LZ对String对象操作还有疑惑,可以看看我整理的一篇文章:
http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Ffengyud
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
// The array representing the String is bigger than the new
// String itself. Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}从我对源码的分析,
String s = new String("abc");
创建了两对象,new String对象是"abc"对象的浅拷贝,
java中对字符串字面值都是String实例.所以创建了两对象,先创建abc对象并加开池中,再浅拷贝一个对象,再返回此对象的引用给s,s在堆中,new String在栈中,池在那里,我还没想明白,