java入門(5)--數組

數組是複合類型

數組是複合類型,內建的複合類型。它與字符串同屬於"類--對象"範疇,有着與「基本類型」很不一樣的行爲和特性。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 方法來完成。

相關文章
相關標籤/搜索