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

程序求解
大侠将下面的程序的输出结果详细的解释一下
public class StringTest
{
public static void main(String[] args)
{
String str1 = new String("abc");
String str2 = new String("abc");
String str3 = "bcd";
String str4 = "bcd";
if(str1 == str2)
{
System.out.println("str1==str2");
}
else {
System.out.println("str1!=str2");
}
if(str3 == str4)
{
System.out.println("str3==str4");
}
else 
{
System.out.println("str3!=str4");
}
str1 = "bcd";
System.out.println("after str1 = \"bcd\"");
if(str1 == str3)
{
System.out.println("str1==str3");
}
else {
System.out.println("str1!=str3");
}
}
}

------解决方案--------------------
就是equals和==的区别,lz看看源码String的equals是如何实现的,其实还是char的==
------解决方案--------------------
Java code

        String str1 = new String("abc");//新构造一个String对象,将"abc"放到里面
        String str2 = new String("abc");//再新构造一个String对象,将"abc"放到里面
        String str3 = "bcd";//jvm在堆中新建一个String对象,值为"bcd",str3与str4都是他的引用。
        String str4 = "bcd";
        if (str1 == str2) {//比较的的两个String对象是不是相同,由于两个对象都是new出来的,那肯定不一样,
            //只是里面放的东西是一样的,就像你的保险箱和我的保险箱都放一模一样的宝石,
            //但你的保险箱跟我的保险箱他不是同一个
            System.out.println("str1==str2");//输出此
        } else {
            System.out.println("str1!=str2");
        }
        if (str3 == str4) {
            System.out.println("str3==str4");//输出此
        } else {
            System.out.println("str3!=str4");
        }
        str1 = "bcd";
        System.out.println("after str1 = \"bcd\"");
        if (str1 == str3) {//str1转为对 "bcd"的引用,与str3一样,也与str4一样;str1 == str3 == str4
            System.out.println("str1==str3");//输出此
        } else {
            System.out.println("str1!=str3");
        }

------解决方案--------------------
用new创建的字符串,在用"=="比较时,由于比较的是内存地址,所以肯定是不一样的,而直接用""创建的字符串,如果用"=="比较,只要内容一样,返回结果也是一样的
------解决方案--------------------
3楼正解
------解决方案--------------------
马士兵的J2SE有说到这个问题,他说这是因为在内存中分为不同的区,局部变量存放在栈区,new出来的对象存放在堆区,静态变量和字符串常量存放在数据区,还有编译后的程序是存放在代码区。
好,有了这些知识就可以开始解释了
Java code

public class PrintFiles
{
    public static void main(String[] args)
    {
        
        String str1 = new String("abc");//new出来一个String对象,存放在堆区,由str1指向它
        /*
         * 又new出来一个String对象,存放在堆区,由str2指向它,
         * 注意,该对象与str1指向的不是同一个对象,
         * 只不过两个对象装的东西是一样的
         */
        String str2 = new String("abc");
        /*
         * "bcd"是字符串常量,存放在数据区,在内存中只有一份,
         * str3跟str4两个都指向它
         */
        String str3 = "bcd";
        String str4 = "bcd";
        if (str1 == str2)//str1跟str2指向不同的对象,因此地址也不一样
        {
            System.out.println("str1==str2");
        } else
        {
            System.out.println("str1!=str2");
        }
        if (str3 == str4)//str3跟str4指向相同的对象,因此地址也一样
        {
            System.out.println("str3==str4");
        } else
        {
            System.out.println("str3!=str4");
        }
        str1 = "bcd";//让str1指向数据区的字符串常量"bcd"
        System.out.println("after str1 = \"bcd\"");
        if (str1 == str3)//现在str1跟str3指向相同的对象了,因此地址也一样
        {
            System.out.println("str1==str3");
        } else
        {
            System.out.println("str1!=str3");
        }
    }