TO small_roc
???
啊,这段代码完全可以执行!不信你试试 :)

解决方案 »

  1.   

    是不是想说同样的常量字符串都实际上指向同一个String对象?
      

  2.   

    结果是
    true true true true false true我想应该是JVM对运行时对程序的优化吧。
    因为对hello的申明和Other.hello的申明可以说是常数,运行时就将对象邦定到同一片内存区域,所以==就会返回true了,应该是同一个对象。
    最后的intern()方法返回的是在pool中和该对象相等的对象。这是我的理解。但实际应用中我觉得没有太多的意义。
      

  3.   

    TO SureBeiJing(轻松节奏) 
      String 是一个特殊的东西,当你说它是对象时,它也可以被视为基本类型;当你把它当基本类型看时,它同时又是对象,是不是这样??我都快晕了!
      例如上面的Other.hello == hello,这个表达式的值为true,但是很明显,他们不是指向同一个对象!
      

  4.   

    TO SureBeiJing(轻松节奏) 
      String 是一个特殊的东西,当你说它是对象时,它也可以被视为基本类型;当你把它当基本类型看时,它同时又是对象,是不是这样??我都快晕了!
      例如上面的Other.hello == hello,这个表达式的值为true,但是很明显,他们不是指向同一个对象!
      

  5.   

    楼上的
    那是我们觉得不是,但由于虚拟机为了提高性能,把他们都邦定到同一个对象上这为什么不可以呢?
    但假如你是new String("Hello"),我想结果肯定差别很大。
      

  6.   

    String类型变量用==来比较的话,应该是比较句柄是否相等,比较内容相等的话,就必须用equals方法,否则很容易出错……
      

  7.   

    根据gfzhx(小小)和wjmmml(笑着悲伤)的意见,再加上我自己的测试,我有了一个判定,当然,不一定正确:  “==”运算符来进行String的判断时,将String对象作为基本类型来判定,而String 的equals方法、compareTo方法则是将其作为对象来判定!  我不知道这样说对不对,而且,这个解释不了最后两个:
    System.out.print((hello == ("Hel"+lo)) + " ");
    System.out.println(hello == ("Hel"+lo).intern());
    前者返回false,后者返回true!
      

  8.   

    ==肯定是比较对象的内存引址,String对象的特殊只是我们可以直接不同过new就可以构造对象,其他的都和对象操作一样。String hello = "Hello"这才是String特殊性的体现。如果按照如果是JVM来处理的,就可以理解最后两个了。
    因为没有直接指定是"Hello",所以就不会被邦定到那块内存中。
    String.intern()的API解释已经很清楚了。
      

  9.   

    to phoenix_zd(天马行空)   我觉得你可能在概念上有一个错误。你还停留在将String当成是“基本类型”的阶段。而在Java中String永远是一个对象。所以当出现“==”的时候,假如两边的表达式时String类型的,你就应该觉察到这些表达式是“对象”,“==”在比较它们的“引用”而非“对象”本身。
      

  10.   

    TO gfzhx(小小) 
      你说“因为没有直接指定是"Hello",所以就不会被邦定到那块内存中。”  你的意思是("Hel"+lo) 和("Hel"+"lo") 两个的运算结果虽然一样,但是却不会在同一个内存区域中了?为什么?而要通过String.intern()的方法来进行优化?