大侠将下面的程序的输出结果详细的解释一下
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");
}
}
}

解决方案 »

  1.   

    就是equals和==的区别,lz看看源码String的equals是如何实现的,其实还是char的==
      

  2.   


    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");
    }
      

  3.   

    不好意思,上面的标记错了
    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");
    }
      

  4.   

    用new创建的字符串,在用"=="比较时,由于比较的是内存地址,所以肯定是不一样的,而直接用""创建的字符串,如果用"=="比较,只要内容一样,返回结果也是一样的
      

  5.   

    马士兵的J2SE有说到这个问题,他说这是因为在内存中分为不同的区,局部变量存放在栈区,new出来的对象存放在堆区,静态变量和字符串常量存放在数据区,还有编译后的程序是存放在代码区。
    好,有了这些知识就可以开始解释了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");
    }
    }再两外举个例子public class StringTest
    {
    public static void main(String[] args)
    {
    String a = "bcd";//"bcd"在代码区,a指向它
    MyClass my = new MyClass();//在堆区new出来一个对象,my指向它
    if (a == my.s)//a跟my.s指向的是同一个对象,地址相同
    {
    System.out.println("s == my.s");
    }
    }
    }class MyClass
    {
    String s = "bcd";//"bcd"在代码区,s指向它
    }
    /*运行结果:
     * s == my.s
     */
      

  6.   

    搞错了,后面那个例子说成“bcd”是在代码区了,应该是在数据区
      

  7.   

     String str3 = "bcd";// 这个字符串是在常量池的  编译器确定
            String str4 = "bcd"别的参考三楼
      

  8.   

    str1==str3,首先我们应该记住在java中String类的对象是可以共享的。在我执行完str1=“bcd”后,java并没有再开辟空间创建一个bcd对象,而是去查找在内存中是否有一个“bcd“的对象,如果有就直接将bcd的地址赋值给str1,所以最后输出的是str1==str3。但是这样也有一个问题,由于在java中的String类的对象是不可以改变的,这就让我们想到假如我们执行str1=”aaa“,那是怎么执行的呢?在java中对于这种赋值是采用在内存中重新开辟空间,再创建一个"aaa"的对象,并将此对象的内存地址赋给str1