我也是个初学者!
  “==”号应该是判断他们的对象引用是不是指向同一个对象吧?
我觉得可能你new出来的是2个不同的对象,所以a3和a4“==”成立吧~!
    我初学随便发表一下意见,如果说错拉大家不要骂我~!

解决方案 »

  1.   

    String a3="china";
    意思是把 "china" 这个字符串字面量(literals )(比如整数 1,2...这些都是字面量)赋给a3
    而字符串字面量都是由String这个类维护的一个实例对象
    所以a3 a4 指向的是同一个对象,他们的地址相同,a3==a4成立
    new出来的对象需要新分配空间,当然地址不一样
      

  2.   

    String a4="china" 首先查找内存中有没有“china” 有的话直接引用
    new 的话是重新分配一个新的内存空间
    ==比较的是不是指向同一片内存
      

  3.   

    两个对象比较用equals(比如a1、a2是两个String对象)==是比较两个直接量是否相等。
      

  4.   

    String的问题如果想弄清楚,去看看jvm的书吧,并不是创建对象和对象引用那么简单,如果是初学的就记下String类的特殊用法,以后再研究
      

  5.   

    String a1=new String("china");意思是:在内存中新分配一段空间,把“china”这个字符串的内容拷贝到新分配的空间里。
     String a4="china";意思是:内存中已经有一个空间里保存着"china"这个字符串,把a4指向这片空间。
    所以,在你的例子,a1,a2指向的都是新开辟的内存空间,它们是不同的。a3,a4指向是同一个内存空间。
      

  6.   

    s就是句柄,对象是“asdf”String s = "asdf"  如果已经存在一个这个asdf对象,那么这个语句不会新作成一个对象。如果不存在的话会新做成一个对象String s = new String("asdf")肯定会新生成一个对象就是说String s1 = "asdf";
    String s2 = "asdf";
    String s3 = "asdf";
    String s4 = "asdf";
    大家指向的是同一片内存空间

    String s1 = new String("asdf")
    String s2 = new String("asdf")
    String s3 = new String("asdf")
    String s4 = new String("asdf")
      

  7.   

    我来说两句:
    String类之所以这么做是有条件的:String是不变类。也就是说每次对String对象进行操作且改变了他的值,那么jvm就会分配一块新的内存给他。这样一来,
    String s1 = "asdf";
    String s2 = "asdf";
    String s3 = "asdf";
    String s4 = "asdf";
    s1,s2,s3,s4就可以使用同一块内存而没有任何问题,因为一旦其中任何一个发生改变,比如说s3发生了改变,那么指向s3的引用就会新的内存地址。如果用new的话,当然就会被强制分配独立的内存空间,使用“==”进行比较的时候当然就返回false了,因为“==”是比较两个对象的引用,而不是内容。
      

  8.   

    String s=new String("asdf");
    String s1="asdf";
    String s2="asdf";
    因为在s2之前已经存在了对象"asdf"(s1引用的那个),所以s2就直接指向它,而不新创建一个
    那么在s1之前不也同样存在了对象"asdf",那为什么s1不直接指向它,而新创建一个呢?
      

  9.   

    看完大家的回答多做几个测试就明白了!
    public class Test
     {
    public static void main(String[] args) 
    {
          String a1=new String("china");
                   String a2=new String("china");
          String a3="china";
          String a4="china";
     
       if(a1.equals(a2))
       System.out.println("a1==a2");
       if(a3==a4)
       System.out.println("a3==a4");
       if(a1==a3)
       System.out.println("a1==a3"); //自己改了试一试!
       }
    }
      

  10.   

    String a1=new String("china");
        String a2=new String("china");
        String a3="china";
        String a4="china";
        if(/*a1==a2*/a1.equals(a2))
             System.out.println("a1==a2");
       if(a3==a4)
             System.out.println("a3==a4");
        if(a1==a3)
             System.out.println("a1==a3");
    ----------------------------------------------------------------
    a1==a2
    a3==a4
    ----------------------------------------------------------------
     if(a1==a2/*a1.equals(a2)*/)
             System.out.println("a1==a2");
       if(a3==a4)
             System.out.println("a3==a4");
        if(a1==a3)
             System.out.println("a1==a3"); 
    ---------------------------------------------------------
    a3==a4
      

  11.   

    字符串相比较药用equals如果直接用 == 则是指针比较。在上面的程序中:jvm是这样操作的:1:申请一块空间存放 china 字符串
    2:再申请一块空间,并将china字符串复制进去,并将它付给s1
    3:再申请一块空间,并将china字符串复制进去,并将它付给s2
    4: 将1中的字符串付给s3
    5: 将1中的字符串付给s4
      

  12.   

    hendy(hendy) 回答得有些道理!
     马上揭贴了哈,谢谢大家的关注!
      

  13.   

    还有一点困惑,就是在new String("china")的时候,就申请一块空间存放china 字符串,然后在把该字符串复制到另外一块空间,这样岂不是很浪费空间。
    应该是在String s3="china"的时候才申请一块空间吧?然后String s4="china"的时候直接把s4指向该空间
      

  14.   

    不要指针又用new的后遗症,还有兼容问题。
    如果严格来说,String a3="china";和    String a4="china";不正确的。
    因为java同学号称“所有皆对象”嘛。
    你不new,哪里生产出来的?
      

  15.   

    hendy(hendy)的意思是说:String a1=new String("china");
                            String a2=new String("china");
                   String a3="china";
                   String a4="china";
    这里是实际上是分配了4个空间,一是“china”的,二是a1,三是a2的,四是a3和a4的,
    是这个意思吗
      

  16.   

    找到一篇文章 相信一定能帮大家解决问题 楼主给点辛苦分吧!
    作者:piggy
    初學Java的人﹐在學習的過程中遇到的第一個不能理解的問題﹐通常就是 
    字串的比較問題﹐因為他們實在不能理解明明兩個"一樣"的字串﹐為什麼 
    有時在做相等的比較運算時會得到ture的結果﹐可是有時得到的結果確是 
    false?這個問題在網路上常常都被提出來討論﹐已經算是一個FAQ到不能 
    FAQ的問題﹐也許是那些初學者們都沒有買到一本好的教科書﹐書中並沒有 
    教導他們正確的認識字串﹐要是有認真地讀完筆者寫的書﹐應該就不會被 
    這個問題所困擾了。好吧!大家都是窮學生買不起五百塊以上的書﹐那筆 
    者就藉著Java週報的一角﹐詳細地說明字串的比較運算。 嚴格說起來﹐字串在Java中也是一個完整的物件﹐兩個物件要做比較時﹐ 
    首先你得先想清楚你想要比較的東西是什麼。舉個例子來說吧﹐日常生活 
    中婆婆媽媽們聚在一起總是喜歡比較來比較去的﹐有時後比的是誰家的孩 
    子功課比較好啦﹐誰的老公賺的錢比較多啦等…。人也是物件的一種﹐當 
    你把兩個人做比較時﹐你一定是把這兩個人身上的某一個屬性拿出來比較 
    ﹐比如說身高、體重、成績等等﹐所以你要說這兩個人完全相同時﹐一定 
    是你所拿出來比較的每個屬性的內容都相同。另外一種觀點的比較方式是 
    ﹐一個人有時會有好幾個不同的綽號﹐別的人要經由比較確認之後﹐才知 
    道原來這幾個綽號指的都是你這個人。 話說回來﹐在Java程式中﹐你要比較兩個物件時﹐首先你要確認要比較的 
    是兩件物件的內容?還是比較兩個物件變數是否指向同一個物件?如果你 
    是要比較兩個物件的內容時﹐請使用該物件所提供的"equals"方法。例如: String str1 = new String("hello"); 
    String str2 = new String("hello"); 
    boolean b1 = str1.equals(str2); 
    booealn b2 = str2.equals(str1); 上例中用誰的equals方法來使用﹐結果都是一樣的(都是true)﹐不過如果 
    str1和str2是兩個不同的類別物件﹐意義可就不太一樣了﹐這個問題有空 
    再說。如果你比較個物件變數指的是不是同一個物件﹐那你就得使用比較 
    算的"=="運算子。例如: String str3 = new String("hello"); 
    String str4 = new String("hello"); 
    String str5 = str3; 
    boolean b3 = str3 == str4; 
    boolean b4 = str3 == str5; b3的結果是false﹐b4的結果是true。不知道筆者這樣的解說﹐大家應該 
    可以清楚的知道什麼時候要使用equals方法﹐又什麼時後要使用"=="運算子。 
    話再說回來﹐會令初學者感到困惑的是類似下面的例子: String str6 = "hello"; 
    String str7 = "hello"; 
    boolean b5 = str6.equals(str7); 
    boolean b6 = str6 == str7; b5的結果是true﹐b6的結果也是true。為什麼b3的結果會是false﹐而b6 
    的結果卻是true呢?上面幾個例子中的字串物件﹐不都是"hello"這個字 
    串嗎?你只說對了一半﹐上面例子中str1到str7所指向的字串物件﹐它 
    們的"內容"都是"hello"這幾個字母沒錯﹐可是它們指向的可不都是同一 
    個字串物件!str1到str4這四個物件變數指向的字串物件﹐是經由標準 
    的物件產生方式(new)所產生出來的﹐就算內容一樣﹐可是還是不同的物 
    件。就像兩個雙胞胎來說﹐甚至兩個用複製出來的人﹐就算所有的屬性 
    都一樣﹐兩個人還是不同的個體﹐在地球上佔用不同的空間。==運算子 
    既然比較的是兩個物件變數是否指向的是同一個物件﹐所以b3的結果會 
    是false就是這個原因囉。 那b6的結果為什麼會是true呢?這是Java為了效能的考量﹐而使用的一 
    種技巧。因為字串對於一個應用程式來說﹐使用上是非常的頻繁的﹐如 
    果每個相同內容的字串物件﹐都佔用不同的記憶空間不是很浪費嗎?而 
    且JVM也要去處理這些可能只用過一次就不再使用的字串。因此﹐當你用 
    雙引號來產生一個字串物件時﹐JVM會先到記憶體中一個名叫String Pool 
    的地方去查詢一下﹐是否裡面已經有這個字串了﹐如果有則直接拿出來 
    使用;如果沒有就產生一個新的放到裡面去。所以str6和str7指向的字 
    串物件﹐都是在Stirng Pool中的hello字串物件﹐既然兩個物件變數指 
    向的是同一個物件﹐那麼用==運算子比較的結果當然就是true了。 被搞的昏頭轉向了嗎?其實就記住筆者最前面所說的﹐當你要比較的是 
    兩個物件的內容相不相等時﹐請用equals方法﹐如果要比較的是兩個物 
    件變數指向的是不是同一個物件時﹑請用==運算子。這樣一來﹐不管是 
    一般的物件還是字串物件在比較時﹐你就不會感到困惑了。
      

  17.   

    意思基本上都明白了, ukulele8656(李坏傻馋) 找的那篇文章不错,但还是没能解释我提的那个问题。
    但是那篇文章中有这么一句:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
    因此﹐當你用 
    雙引號來產生一個字串物件時﹐JVM會先到記憶體中一個名叫String Pool 
    的地方去查詢一下﹐是否裡面已經有這個字串了﹐如果有則直接拿出來 
    使用;如果沒有就產生一個新的放到裡面去。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
    那么唯一的解释就是new出来的和直接赋值(=)出来的放在内存中的位置不一样!
    直接赋值出来的放在一个叫String Pool的地方,但new出来的放在不同的地方,那是什么地方呢,堆中?是这样解释吗?
      

  18.   

    java中new 的所有对象应该都是放到堆中!揭帖了哈!如果还有什么异议,就另开帖再讨论,最后,谢谢大家了:),特别感谢Tasia(非典型…………)  zqq7231(黑影)  hendy(hendy) 
     ukulele8656(李坏傻馋)