1)若想搞清楚java中的值傳遞和引用傳遞,首先要搞清楚java中兩種數據類型:基本類型和引用類型。java中基本類型只有八種,以下所示:java
其他的都是引用類型(就是使用new運算符建立的對象類型),例如String,Integer、數組等。數組
2)這兩種類型的變量的存儲位置也不一樣。基本類型是存儲在棧上,屬於線程局部的,只供本線程訪問。而引用類型是存儲在堆上,能夠供進程的全部線程訪問。從棧裏面申請內存,簡單快速,可是容量有限。堆是全部線程共有的,從堆裏面申請內存要進行相關的加鎖操做,所以申請堆內存的複雜度和時間開銷比棧要大不少。app
3)這兩種類型存儲的值意義不一樣。基本類型變量存儲的值就是變量的實際值(字面值,一個字符,數值或者布爾值),而引用類型存儲的值是指向對象的地址值。ui
int val;//基本類型聲明時,即分配內存空間(存放數據)。 val=10; Date date;//引用類型聲明時,只是給引用類型變量date分配了內存空間。 date=new Data();//使用new操做符建立對象實例時,才建立對象的內存空間。在這裏,將對象內存空間的地址複製給date date2=date;//只是將對象地址賦給了date2,並無複製對象。指向同一個對象
總之,java中值傳遞方式就是值傳遞,只是基本類型變量傳遞的是字面值,而引用類型傳遞的是指向對象的地址值,歸根到底都是值。spa
4)以一個實例說明值傳遞和引用傳遞:線程
1 public class TestMain { 2 public static void main(String[] args) { 3 String a = "a"; 4 String b = "b"; 5 operator(a, b); 6 StringBuilder x = new StringBuilder("x"); 7 StringBuilder y = new StringBuilder("y"); 8 System.out.println(a + "," + b); 9 System.out.println(x + "," + y); 10 } 11 12 public static void operator(String a, String b) { 13 a += b; 14 System.out.println("new a:"+a); 15 b = a; 16 17 } 18 19 public static void operator(StringBuilder a, StringBuilder b) { 20 a.append(b); 21 b = a; 22 } 23 }
結果以下:code
5)關於"=="和equals對象
6)最後,總之,引用類型存儲的是對象的地址blog