public class StringExample
{
 public static void main (String args[])
 {
 String s0 = "Programming";
 String s1 = "Program";
 String s2 = s1 + "ming";
 String s3 = "Program" + "ming";
 
 System.out.println("s0 == s2: " + (s0 == s2));
 System.out.println("s0 == s3: " + (s0 == s3));
 }
}
输出结果:
s0 == s2: false
s0 == s3: trueWHY???

解决方案 »

  1.   

    因为s3在编译期就已经确定,所以编译器只会把它编译成"Programming",且由于String是不可变对象,故而在同一class/方法内的所有编译期就能确认相同的String指向同一个堆对象。而s2的值在编译期无法确认,只能在运行期确定,所以没法享受到这个“优惠政策”。
      

  2.   

    为什么s3在编译起就已经确定了,而s2却确定不下来?从上面情况看:s2 和 s3的区别就是多了一个中间变量s1而已啊??
      

  3.   

    在这点上java编译器是如何处理的呢?
      

  4.   

    public class StringExample
    {
     public static void main (String args[])
     {
     String s0 = "Programming";
     String s1 = "Program";
     String s2 = s1 + "ming";
     String s3 = "Program" + "ming";
     
     System.out.println("s0 == s2: " + (s0.equals(s2)));
     System.out.println("s0 == s3: " + (s0.equals(s3)));
     }
    }
    你現在在看看結果是什麽
      

  5.   

    顶ZUO SF DE LAO DA
      

  6.   

    jicken_woo(聞香識女人...................................) 
    equals是值的比较,当然都相等了。
    在比较地址上出现这个问题的原因是??
      

  7.   

    >为什么s3在编译起就已经确定了,而s2却确定不下来?从上面情况看:s2 和 s3的区别就是多了一个中间变量s1而已啊??因为当代的编译器还不够智能,它很难跟踪这个量在运行到此处之前,引用的内容会不会发生变更
      

  8.   

    "s0"= "Programming"
    count= 11
    hash= 0
    offset= 0
    value= char[11]  (标识=20)
    [0]= P
    [1]= r
    [2]= o
    [3]= g
    [4]= r
    [5]= a
    [6]= m
    [7]= m
    [8]= i
    [9]= n
    [10]= g
    [0]= P
    [1]= r
    count= 11
    "s3"= "Programming"
    count= 11
    hash= 0
    offset= 0
    value= char[11]  (标识=20)
    [0]= P
    [1]= r
    [2]= o
    [3]= g
    [4]= r
    [5]= a
    [6]= m
    [7]= m
    [8]= i
    [9]= n
    [10]= g
    hash= 0
    "s2"= "Programming"
    count= 11
    hash= 0
    offset= 0
    value= char[23]  (标识=17)
    [0]= P
    [1]= r
    [2]= o
    [3]= g
    [4]= r
    [5]= a
    [6]= m
    [7]= m
    [8]= i
    [9]= n
    [10]= g
    [11]=
                      [12]=
                      [13]=
                      [14]=
                      [15]=
                      [16]=
                      [17]=
                      [18]=
                      [19]=
                      [20]=
                      [21]=
                      [22]=
                      [23]=雖然已經結貼,但是,我還是把這個發出來看看,這是eclipse 調試的顯示,不知道能説明什麽