我觉得是:==比较的主要是引用(即地址)是否相同,如果要比较字符串最好用equal。所以,第一个和第二个所比的字符串地址是不同的,而第三个他们都指向Welcome to java 的字符串。

解决方案 »

  1.   

    public class Try
    {
    public static void main(String args[])
    {
    String str1,str2,str3;
    str1="Welcome to java";//常量池的一个常量,赋个一内存地址
    str2="Welcome to";//分配了另一个地址
    str3=str2+" java";//指向一个新地址,储存字符操作的变化量
    if(str1==str3)
    System.out.println("yes");
    else
    System.out.println("no");
    }
    }
    輸出結果爲NO.
                            
    String str1=new String("Welcome to java");
    String str2=new String("Welcome to java");
    if(str1==str2)//两个对象比较明显不一样
    System.out.println("yes");
    else
    System.out.println("no");
    輸出結果爲NO. String str1="Welcome to java";
    String str2="Welcome to java";
    if(str1==str2)//在常量池里面的同一个常量比较一样,都是指向一个常量
    System.out.println("yes");
    else
    System.out.println("no");
    輸出結果爲YES.
    請問這三個例子有什麽不同.
      

  2.   

    1.==比较的主要是引用(即内存地址)是否相同。所以打印no.
    2.str3=str2+" java";是引用地址。常量一样,指向相同地址。你要了解,有空了解一下常量池对你有帮助。如果要比较字符串就用equal,JAVA比较时,类型一定要相同。左右对称的说法。
      

  3.   

    "==" 比较的是字符串的引用地址
    由于字符串的类型是final,是常量,要改变其内容就是重新new一个新的字符串出来,将指针指向新的内容(1):
    String str1="Welcome to java";
    //"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"String str2="Welcome to";
    //"Welcome to"在栈中创建,没对str2在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to"String str3=str2+" java";
    //重载操作符"+",在堆中重新分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它由于其中一个是new操作来的,一个栈变量,一个堆变量,不同的内存空间,所以不同(2):
    String str1=new String("Welcome to java");
    //在堆中分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它String str2=new String("Welcome to java");
    //在堆中分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它两个都是new操作来的,在堆中分配了不同的内存空间,都是堆变量,内容相同堆中地址不同,所以不同(3):
    String str1="Welcome to java";
    //"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"String str2="Welcome to java";
    //"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"因为没在堆中分配内存空间,两者只是建立一个句柄(指针)指向栈中内容"Welcome to java",所以两个相同(1)中的str1 和(3)中的str1 比较也应该相等.