public class Test1{
public static void main(String args[])
{
String a="java";
String b="java";

System.out.println(a==b ? "a==b": "a!=b");

}


}不明白上面这个程序的执行结果为什么是:a==b?
我觉得不相等。难道常量的值相等,则a和b指的就一定是一个地址么?

解决方案 »

  1.   

    你可以看看你上几楼有一篇文章,你的问题答案一清楚二楚,Java精华积累:每个初学者都应该搞懂的问题!
      

  2.   

    a ,b 都是指向java对象的引用  所以相等
    String a="java";  String b="java";  这样a==b 为 true
    String a=new String("java"); String b=new String("java"); 这样a==b 为false a,b是不同的对象 要想相等,应该这样写a.equals(b)
      

  3.   

    谢谢楼上的建议。我看了那个不错的帖子。
    按照那个帖子的说明,我的运行结果应该是a!=b。
    可是我运行完的结果是a==b,我就弄不明白了。和那个帖子上说的完全相反阿。
    您可以运行试试。
      

  4.   

    是的要弄清哦
    String a="java";
    String b="java";
    -----------------
    String a=new String("java");
    String b=new String("java");
    ------------------
      

  5.   

    String a="java"; 与String a=new String("java");
    是不等价的?
    常常看到书上说是等价的?
      

  6.   

    “java”是String型对象,a是对这个对象的引用,指向这个"java",b也是对这个对象的引用,也是指向"java",他们指向同样的地址,所以相等。
    正如楼上说的如果:
    String a=new String("java"); String b=new String("java"); 
    那么你是声名了两个对象a和b,地址不同,所以a==b 为false
      

  7.   

    给你说说string的相关知识吧:
    对于string对象:使用new和不使用new的差别:
        用new的话就明确的告诉了JVM这个串对象需要新创建,也不是到串池里取。而s="Hello"会先到串池里取,没有才新创建并放到池里。比如:
        String s1 = new String("Hello");
        String s2 = "Hello";
        String s3 = "Hello";
        则会创建两个String对象(值都为"Hello"):s1指向一个,s2和s3共同指向一个,且s2和s3指向的对象放在串池里。
        建议:尽量使用String s = "Hello"的形式,这样提高效率。
     
    String 的比较:equals()方法与==有何不同
        一般,equals比较变量的值是否相等,而==是比较变量的内存地址是否相等(即同一对象)。比如上面定义的String中:
        s1.equals(s2)、s1.equals(s3)、s2.equals(s3)以及s2==s3都为true,而s1==s2、s1==s3都为false。
        建议:尽量使用equals()方法,因为基本上我们比较的是变量值。这样你应该理解了吧!!!