当前位置: 代码迷 >> J2SE >> 程序求解解决思路
  详细解决方案

程序求解解决思路

热度:120   发布时间:2016-04-24 12:28:36.0
程序求解
大侠将下面的程序的输出结果详细的解释一下
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");        }    }
  相关解决方案