to phoenix_zd(天马行空) 我觉得你可能在概念上有一个错误。你还停留在将String当成是“基本类型”的阶段。而在Java中String永远是一个对象。所以当出现“==”的时候,假如两边的表达式时String类型的,你就应该觉察到这些表达式是“对象”,“==”在比较它们的“引用”而非“对象”本身。
TO gfzhx(小小) 你说“因为没有直接指定是"Hello",所以就不会被邦定到那块内存中。” 你的意思是("Hel"+lo) 和("Hel"+"lo") 两个的运算结果虽然一样,但是却不会在同一个内存区域中了?为什么?而要通过String.intern()的方法来进行优化?
true true true true false true我想应该是JVM对运行时对程序的优化吧。
因为对hello的申明和Other.hello的申明可以说是常数,运行时就将对象邦定到同一片内存区域,所以==就会返回true了,应该是同一个对象。
最后的intern()方法返回的是在pool中和该对象相等的对象。这是我的理解。但实际应用中我觉得没有太多的意义。
String 是一个特殊的东西,当你说它是对象时,它也可以被视为基本类型;当你把它当基本类型看时,它同时又是对象,是不是这样??我都快晕了!
例如上面的Other.hello == hello,这个表达式的值为true,但是很明显,他们不是指向同一个对象!
String 是一个特殊的东西,当你说它是对象时,它也可以被视为基本类型;当你把它当基本类型看时,它同时又是对象,是不是这样??我都快晕了!
例如上面的Other.hello == hello,这个表达式的值为true,但是很明显,他们不是指向同一个对象!
那是我们觉得不是,但由于虚拟机为了提高性能,把他们都邦定到同一个对象上这为什么不可以呢?
但假如你是new String("Hello"),我想结果肯定差别很大。
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
前者返回false,后者返回true!
因为没有直接指定是"Hello",所以就不会被邦定到那块内存中。
String.intern()的API解释已经很清楚了。
你说“因为没有直接指定是"Hello",所以就不会被邦定到那块内存中。” 你的意思是("Hel"+lo) 和("Hel"+"lo") 两个的运算结果虽然一样,但是却不会在同一个内存区域中了?为什么?而要通过String.intern()的方法来进行优化?