是这样的,
java里有优化处理机制,
这个机智就是:
如果你直接:String s="AAA",
注意,是直接给了数值,而不是通过new String("AAA"),
则,jvm会在内部一个列表内给你分配地址,
等你再String s2="AAA"时,jvm会查这个列表,看是否有“AAA”,如果有,就重用。但,对于new String("AAA")则每次都会申请新的地址,不会做优化处理。
所以,产生了你的现象。

解决方案 »

  1.   

    free的地址是固定的。在一个内存区里。
    new String后等于在另一内存区写了“free”
    所以为false。当你把str2 重新赋值为 free时,它和str1同时指向free的地址,所以又是true了。如果你把str1 = new String("free");//相当于又在另一个内存区写了“free”
    str2= new String("free");
    然后比较str1 == str2还将是false的
      

  2.   

    str1 ==str2 判断是否引用同一个对象!!当引用同一个对象时,返回为真,否则为假!!
    str1.equals(str2) 判断str1同 str2 是否相等!!
      

  3.   

    String 在java中是属于不可变的常量(String objects are immutable they can be shared),当你通过 
    varName1 = "XXX";
    varName2 = "XXX";
    来赋值的时候,varName1 ,varName2 将指向同一地址,所以 (varName1 == varName2)返回true.
      

  4.   

    str1==str2  判断的是两个str的地址是否相等
    str1.equals(str2) 判断两个str的值是否相等
      

  5.   

    str1 == str2是判断这两个引用是否来自同一个String对象。
    如果单纯的判断两个string的值是否相等,用如下方法:
    if((str1 != null) && (str2 != null)) {
        if(str1.equals(str2)) {
            //如果相等的处理
        }
    }注意,如果不判断是否是null,可能会引起NullPointerException。