日期:2014-05-20  浏览次数:20836 次

请帮忙看看这个输出
String str1="abc";
  String str2="hello"+str1;
  String str3="hello"+str1;
  System.out.println((str2==str3));
为什么是false
改成这样
String str1="abc";
  String str2="hello"+"abc";
  String str3="hello"+"abc";
  System.out.println((str2==str3));
这样为什么又变成true呢
------解决方案--------------------
应该是 String str2="hello"+str1;这样涉及到了str1的地址,所以导致str2和str3的对象地址不同吧。 String str2="hello"+"abc";这个是直接从常量池中引用,所以是一样的。(本人也是新手,意见仅供参考)
------解决方案--------------------
我觉得可能是这样的:

  String str1="abc";
  String str2="hello"+str1;//在堆中创建一个String对象存放 "hello" + str1;
  String str3="hello"+str1;//同上
  System.out.println((str2==str3));//两个引用指向堆中不同的对象,值为false


  String str1="abc";
  String str2="hello"+"abc";//因为是两个常量相加,在常量池中创建一个新的常量 "hello" + "abc"
  String str3="hello"+"abc";//同上
  System.out.println((str2==str3));//两个引用指向常量池中同一个对象,值为true

------解决方案--------------------
就是5楼说的那样,这样说吧,常量池是放确定的内容,String str2="hello"+str1; 因为str1是引用,所以可能变化,所以java并不会在常量池里创建一个空间保存helloabc,所以就new 一个堆内存存入helloabc,str2指向他,同理str3也一样,==是比较引用地址,所以2个对象的地址不可能相等。而String str2="hello"+"abc";是一定的(一定是helloabc)所以java会把它放入常量池str2指向他同理str3也指向他,所以他们的地址一样
------解决方案--------------------
代码:
public class Stringequals {
    public static void main(final String[] args) {
        System.out.println(test01());
        System.out.println(test02());
        System.out.println(test03());

        System.out.println(test10());
        System.out.println(test20());
        System.out.println(test30());
    }

    private static boolean test01() {
        String str1 = "abc";
        String str2 = "hello" + str1;
        String str3 = "hello" + str1;
        return str2 == str3;
    }

    private static boolean test02() {
        String str2 = "hello" + "abc";
        String str3 = "hello" + "abc";
        return str2 == str3;
    }

    private static boolean test03() {
        String str2 = new String("hello"+"abc");
        String str3 = "hello" + "abc";
        return str2 == str3;
    }

    private static boolean test10() {
        String str1 = "abc";
        String str2 = "hello" + str1;
        String str3 = "hello" + str1;
        return str2.equals(str3);
    }

    private static boolean test20() {
        String str2 = "hello" + "abc";
        String str3 = "hello" + "abc";
        return str2.equals(str3);
    }

    private static boolean test30() {
        String str2 = new String("hello"+"abc");
        String str3 = "hello" + "abc";
        return str2.equals(str3);
    }
}


输出:
false
true
false
true
true
true

说明:
test01、02、03都是在比较两个对象的引用是否相等,
test02里面都是完全的字面常量,Java为了节约内存空间,会把它们保存在完全相同的地址上

这里的目的应该是比较各个对象的字面量是否相同,应该使用String类的equals()方法

test10、20、30是修改后的正确的书写方法
其中test03和test30是追加的示例