數組是複合類型,內建的複合類型。它與字符串同屬於"類--對象"範疇,有着與「基本類型」很不一樣的行爲和特性。java
首先的不一樣是,這些複合類型都有「方法」,能夠經過「點「操做來調用。數組
好比:spa
String s = "abc";指針
int n = s..length(); //取得字符串的長度code
基本類型如 int double char 等是不能進行點操做的。對象
另外,有些複合類型還有「屬性」,其調用與方法相似,只是不加圓括號。blog
好比,求數組的長度就不是調用方法,而是屬性。內存
int[] a = {1,2,3,4};字符串
int n = a.length;class
還有最最重要的一個不一樣,複合類型是有引用這個說法的。
當咱們寫:int a = 5; 的時候,a 變量裏裝的就是一個整數。
double b = 3.14; 則 b 中裝的就是浮點數。b 佔用的空間比 a 要大。
若是換成複合類型就不一樣了。
String a = "1234";
String b = "1234567";
這裏的 a 和 b 都不是字符串自己,而是指向字符串對象的引用(相似於 c 語言中的指針),
引用的本質就是對象在內存中的地址。於是,無論對象有多大,引用的大小老是固定的,只佔用很小的內存。
既然引用和對象是分離的實體,若是咱們寫:
String s;
這時,只創建了一個引用變量,尚未關聯到某個對象。
若是咱們須要明確地說:個人這個引用就是不指向任何對象,能夠這樣寫:
String s = null;
關於類,對象,引用等面向對象的更多的理論,在之後的專題中討論。
這裏,只要先知道這種類型與基本類型有些不一樣,提升警戒也就是了。
能夠直接經過給出數組的元素來建立數組對象,並初如化。
double[] a = {1.0, 1.5, 2.0, 2.5, 4.0, 4.3};
上面的代碼先建立了一個引用 a,它的類型是:double[],即指向浮點數組的引用。
而後,建立了一個數組對象,該數組對象包含 6 個元素(即數組的長度爲 6),元素的類型是 double
而後,用花括號中的數據爲每個元素進行初始化。
最後,把新建立的數組對象的地址寫入到 a 中,即讓 a 引用指向這個剛剛建立的數組對象。
也能夠:
double[] a = new double[6]; a[0] = 1.0; a[1] = 1.5; a[2] = 2.0; ...
這段代碼則是先建立了 包含 6 個元素的數組,但並不去分別對每一個元素賦值。
接下來的代碼再一個元素一個元素地賦值。
須要注意的是,不一樣於 c 語言,這裏若是沒有其下的賦值代碼,元素中也是有固定值的,並非一個隨機數字。
java 中約定,變量老是會默認初始化,根據類型不一樣有不一樣的初始化值。
int double char 都是 0
boolean 是 false, 引用類型則是 null
數組的基本操做是:求它的長度,讀取每一個元素的值,爲某個元素賦值。
下面的代碼求一個數組中全部元素的最大值。
1 public class A0410 2 { 3 public static void main(String[] args){ 4 double[] a = {2.3, 4.5, 12.6, 0.4, 7.8, 9.2, 1.7}; 5 double m = a[0]; 6 for(int i=1; i<a.length; i++){ 7 if(a[i] > m) m = a[i]; 8 } 9 System.out.println(m); 10 } 11 }
這是求多個數中最大值的基本手段,應該儘早熟悉,其思想相似於擂臺賽。
請注意,java 與 c 語言同樣,數組的下標都是從 0 開始的。因此最大的下標是: a.length-1
下面看這樣一個問題:
假設你面前有 50 個空盒子,其編號是 1 ~ 50
現還,你在第 1 個盒子裏放 1 顆豆子,在第 2 個盒子裏放 2 顆豆子, 在第 3 個盒子裏放 4 顆豆子 ....
總之,後面的盒子中的豆子數是前一個盒子的 2 倍。
那麼,要完成這個任務,你一共須要多少顆豆子?
1 public class A0410 2 { 3 public static void main(String[] args){ 4 long[] a = new long[50]; 5 // 放豆子 6 a[0] = 1; 7 for(int i=1; i<a.length; i++){ 8 a[i] = a[i-1] * 2; 9 } 10 // 統計總數 11 long sum = 0; 12 for(int i=0; i<a.length; i++){ 13 sum += a[i]; 14 } 15 16 System.out.println(sum); 17 } 18 }
這裏須要注意,豆子的數目會很快地增加,用 int 類型存儲是不夠的。你可能會想,若是盒子更多怎麼辦?
不用急,java提供了 BigInteger 類型,能夠表示任意大的整數。
爲了邏輯上的清晰,咱們把放豆子和求和這兩個步驟分開了,實際上,能夠邊放豆子,邊統計總數。
甚至是,根本不用數組,直接累加就能夠!!
數組能夠像其它類型同樣,在調用方法時,做爲參數傳遞。
但須要高度警戒,數組是對象,而程序中寫出的貌似數組的變量,實際上只是指向數組的指針而已。
咱們在方法間傳遞的是引用,不是數組對象自己,這十分重要!!
由於這意味着:被調方與主調方共享同一個數組對象,一方修改,另外一方可見!!
若是在邏輯上不但願共享數組,能夠在方法中,把傳進來的數組複製一下。
下面的程序演示了對一個數組中的全部工資進行加薪處理。
1 public class A0410 2 { 3 // salary: 工資數組 4 // per: 加薪的百分點 5 static void raise(double[] salary, double per){ 6 for(int i=0; i<salary.length; i++){ 7 salary[i] *= 1 + per / 100; 8 } 9 } 10 11 static void show(double[] salary){ 12 for(int i=0; i<salary.length; i++){ 13 System.out.print(salary[i] + " "); 14 } 15 System.out.println(); 16 } 17 18 public static void main(String[] args){ 19 double[] salary = {4520,5311,3766,8600,4700,7125}; 20 raise(salary,10); // 加薪 21 show(salary); // 顯示新的薪資 22 } 23 }
顯示一個數組中的所有元素是很常見的任務,咱們也能夠調用 java.util.Arrays.toString 方法來完成。