看看thinking in java吧,里面写的很清楚。

解决方案 »

  1.   

    几个要点是:
    == 在比较主类型的时候比较的是值;
    == 在比较对象类型的进修比较是对象的引用,基本上是对象的地址吧;
    String 类型创建后是不变的,所以String 类型的字面常量会被JVM重用;
    用 new 创建的对象都是会在堆上创建的。
      

  2.   

    i1,i2是 对象不能用==比较!要用equals().
    new 一个东西,指的是在内存区重新开辟一个对象!
    String t2="test";就 等于:String t2=new String("test");
      

  3.   

    你可以这样考虑:
    因为String类型反正不可改变值,所以如果同样内容的两个String变量,一般来说,可以指向同一个对象而不影响程序结果,因此编译器尽可能检查这种引用,进行优化。
    前一种用法,编译器可以进行优化,使得t1和t2指向同一个对象
    后一种用法,你强制调用了一个new String(),因此t2是一个新的String对象
    而"=="就是用来比较两个引用是不是指向同一个对象的
    不要乱想,String就是一种对象,就是字符串,也是Object.