一道面試題:StringBuffer a=new StringBuffer ("A"); StringBuffer b=new StringBuffer (StringBuffer線程安全 StringBuilder線程不安全)


前幾天又看到這個面試題,再次看看

public class Jtest{

      public static void main(String[] args) {

            StringBuffer a=new StringBuffer ("A"); 

            StringBuffer b=new StringBuffer ("B");

            oper(a,b);

            System.out.print(a+","+b);

        }

      static void oper(StringBuffer c,StringBuffer d){

          c.append("B");   

          d=c;

      }

}

------輸出結果是什么?

此題關鍵就在於 oper(c,d) 方法,這個方法到底做了什么,怎么結果就和想的不一樣呢?
那么,就來看一下這個方法做了什么。

上代碼:

package test;  
public class Jtest{  
      public static void main(String[] args) {  
           StringBuffer a=new StringBuffer ("A");   
           StringBuffer b=new StringBuffer ("B");  
           //取代 oper(a,b) start;  
              StringBuffer c;  
              StringBuffer d;  
              c = a; //c的地址指向了a,此時 c 的值為"A";  
              d = b; //d的地址指向了b,此時 d 的值為"A";  
              c.append("B"); //在c(a)的地址值變為 “AB”  
            d=c; // d的地址指向了c,也就是指向了a,**關鍵就在這里了**,那么可以看到,這個過程中根本就沒對b做任何操作,  
            //就好像gg(d)路過一mm(b),說:這mm(b)不錯,然后發現前面有個更有吸引力的mm(c)然后就見異思遷了,然后拿了一朵花("B")給mm(c(a))了,,所以mm(b)壓根就不知道什么情況,沒參與  
           // so, b 還是b("B") , a已不是a("A"),二是a("AB")  
            //取代 oper(a,b) end;   
            System.out.print(a+","+b);  
      }  
      static void oper(StringBuffer c,StringBuffer d){  
          c.append("B");     
          d=c;  
          //一開始的想法是這樣的,c = a; d= b; 那么 c.append("B");后 c=“AB”,d=c = "AB",實際上並不是數學中的簡單等價傳遞  
      }  
}  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM