楼上的童鞋,比较的是一个对象,不是两个对象!我查了不少资料,所以说呢,现在我对String还是比较了解的。
hello 发生在编译时,被放在字符串池String pool中,栈内存里,也就是说,hello在编译时已经知道它的值是"hello"了
"Hel" + lo 发生在运行时,新生成的一个字符串,编译时,"Hel" + lo的值还不知道,因为这个表达式有引用参加运算,算是动态的字符串,只有在运行时才产生它的对象,这时才知道它的真正地址。你想想运行时产生的地址和编译时产生的地址会相同吗?
下面是字符串intern方法的api解释和其源码,看懂了你就知道方法返回的是字符串在字符串池的栈内存的引用。
而同一时间,字面值相同的字符串在字符串池中只有一个栈内存地址的引用,因为如果相同的字符串想加入到字符串池的时候,返回的是字符串池里面那个字面值相同的字符串的内存地址。所以"hello"==hello,("hel"+lo).intern()==hello,返回的都是true。[code=java]/* <p>
* When the intern method is invoked, if the pool already contains a
* string equal to this <code>String</code> object as determined by
* the {@link #equals(Object)} method, then the string from the pool is
* returned. Otherwise, this <code>String</code> object is added to the
* pool and a reference to this <code>String</code> object is returned.
* <p>
* @return a string that has the same contents as this string, but is
* guaranteed to be from a pool of unique strings.
*/
public native String intern();[/code]我在帖子http://bbs.itheima.com/thread-377-1-1.html中有较详细的回答,你可以参考。
[ 本帖最后由 覃俊瑞 于 2011-08-03 23:08 编辑 ] |