前两个可能编译器优化成了引用到同一个对象。
后面的不可以做这种优化,因为程序中明确指定了使用“new”产生新对象。

解决方案 »

  1.   

    当然不同啦
            System.out.println(s1 == s2); // true 因为他们都指向"abc"这个字符串
            
            System.out.println(s3 == s4); // false, 因为s3 和 s4 是new出来了, 各指向不同
                                             的对象地址
      

  2.   

    是的了,new是一个新对象,编译器不能对这种对象进行优化的了。
      

  3.   

    这个问题不是第一次看到有人问了,楼主搜索一下旧贴在这个java小区里,就可以找到了。关于String的。String s1 = "hello";
            
    String s2 = "hello";
    指创建一个对象,在常量池里,"hello".String s3 = new String("hello");
    创建2个对象。一个常量池,一个new 产生的。
    String s4 = new String("hello");
    创建2个对象。一个常量池,一个new 产生的。对于引用对象,而不是基本类型,java的==是比较2个对象的引用是不是一样,不是比较数值是不是一样。
      

  4.   

    对于常量可以用==
    但是对于对象就不能用”==“我建议楼主多看看jdk中关于equals和compareTo的用法
      

  5.   

    System.out.println(s1 == s2); // true 因为他们都指向"abc"这个字符串
            
            System.out.println(s3 == s4); // false, 因为s3 和 s4 是new出来了, 各指向不同
                                             的对象地址
      

  6.   

    apollo333() 说得比较清楚了以后如果要比较值相同,用equals==是比较引用值,s1、s2是常量池内的同一个常量,所以引用相同,用new出来的引用都不同
      

  7.   

    学习一下java的创建变量的地址吧.那样你会了解这个问题,网上有很多这样的讲解.
      

  8.   

    值比较用equals,==一般比较的地址,或者说是对像句柄,
      

  9.   

    equals 是对象内容比较,==是内存地址比较!
    new 产生的对象在JVM内存堆上分配了两个地址,存放String对象!
      

  10.   

    好象关于这方面的问题好多啊去看看thinking in java吧。里面的解释非常清楚