public class Test {

public static void main(String [] args)
{
String a=new String("aaa");
String b=new String("bbb");
b=a;
System.out.println(a==b);  
a=a+"";
System.out.println(a==b);


System.out.println(a);
System.out.println(b);
}
}
为什么对a 操作之后 a==b 就是 false 了呢?
不还都是引用了同一个对象吗?

解决方案 »

  1.   

    http://blog.csdn.net/whzresponse这里面有一篇文章,你去看看就知道了!
      

  2.   

    应该用equals比较吧,java的书里面都重点的讲了这方面的东西,好好看看。
      

  3.   

    大家看一下你是否知道下面的是输出结果:
     public static void main(String[] args) ...{
            String str1 = "abc";
            String str2 = new String("abc");
            String str3 = new String();
            String str4 = new String("");
            System.out.println(str1 == str2);// ①
            System.out.println(str1.equals(str2));// ②
            System.out.println(str3 == str4);// ③
            System.out.println(str3.equals(str4));// ④
            String str5 = "a";
            String str6 = "b";
            String str7 = "ab";
            String str8 = "a" + "b";
            String str9 = "a" + str6;
            System.out.println(str7 == str8);// ⑤
            System.out.println(str7 == str9);// ⑥
            System.out.println(str7 == str5 + str6);// ⑦
        }
      

  4.   

    如果不知道还请看http://blog.csdn.net/whzresponse
      

  5.   

    false
    true
    false
    true
    true
    false
    false
    应该是这个结果吧......
      

  6.   

    JAVA中的"引用"与C++中不同,JAVA中的"引用"是用在对象上的.
    再说"=="并不是引用,而是赋值. (我是这么理解的)
      

  7.   

    通过引用操作对象会改变引用本身吗? 
    ================================
    首先,答案肯定是 会。之所以lz的实验得到这样的结果,是因为String类型本身比较特殊。
    举个简单的例子
    String a = "1";
    String b = "2";
    b = a;
    a = a + "love";
    最基本的: b = 2 ; a = 1love。
    有时候问题就是这么简单。
    ============================================================
    大家看一下你是否知道下面的是输出结果:
     public static void main(String[] args) ...{
            String str1 = "abc";
            String str2 = new String("abc");
            String str3 = new String();
            String str4 = new String("");
            System.out.println(str1 == str2);// ① false                          
            System.out.println(str1.equals(str2));// ② true
            System.out.println(str3 == str4);// ③ false
            System.out.println(str3.equals(str4));// ④ true
            String str5 = "a";
            String str6 = "b";
            String str7 = "ab";
            String str8 = "a" + "b";
            String str9 = "a" + str6;
            System.out.println(str7 == str8);// ⑤ true
            System.out.println(str7 == str9);// ⑥  true
            System.out.println(str7 == str5 + str6);// ⑦ true
        }
    ==========================================================
    用eclipse跑了一下,发现错了2个, 6和7错了,有没有高人指点为什么错了。
    请明确指点,不要再叫我看什么资料了,谢谢。
      

  8.   

    6 7  没有错就是false
      

  9.   

    首先我觉得太追究这个东西没什么必要,判断值相等用equal,判断引用地址想等都用==,我想对象比较一般也不会用到==,用到的时候也不会像上面测试那样复杂,没人愿意浪费可读性写那种自己读起来都闹心的程序的。另外简单说说这个问题。String有两种生成对象的方法String="****";
    String=new String("");另外要明确一点,String虽然是个对象,但是它有很多基本数据类型的特点,所以它是用不可变模式做成的,就是说你不可能通过函数改变一个String本身的情报。当你想要改变的时候,string本身并没有被你改变,他会返回一个新的string对象给你使用。而你想要修改的sting对象本身还是存在并且没有被修改的当使用String="****"的时候,java会把生成的对象作为一个常量保存在常量池中
    当使用String="****"的时候,java会首先查找常量池中是否已经存在,如果存在则引用指向常量池中对应对象,如果不存在,则生成新的对象保存在常量池中。
    当使用形如String="***"+"*****"同上。正因为string是不可变模式,所以java才可以使用上面的处理,来优化我们的代码,比如减少内存使用当使用String = new String();系统会无条件开辟新的内存来保存对象。
    当使用形如string=""+str,String=str+"",String=str+str,系统都会无条件开辟新的内存来保存对象。==比较的是是否使用同一块内存,equal比较的是内存中存放的东西是不是一样的。以上,应该可以判断出什么时候是true,什么时候是false.