<Thinking in Java>
讀書筆記
――數組
數組只是相同類型的,用一個標誌符名稱封裝到一起的一個對象序列或基礎資料型別 (Elementary Data Type)序列。
數組的初始化在java中,定義數組的格式可以是以下兩種方式:int[] a1;int a[];兩種方式結果相同,以上只是定義了一個數組的引用,此時編譯器不允許指定數組的大小,因為現在擁有的只是對數組的一個引用,並沒有為數組分配任何空間。即如下方式定義是錯誤的:int[5] a;int a[5];若產生的是一個基礎資料型別 (Elementary Data Type)的數組,則java預設將數組中的每個元素設為0(若為boolean型,則設為false),若聲明的是一個對象數組,則如下語句:Object[] obj=new Object[10];並沒有完成初始化工作,必須為obj的每個元素賦值,初始化進程才算完成。
數組的複製在java中可以將一個數組值賦給另一個數組值,所以可以有如下寫法:int[] a1=new int[5];
int[] a2;
a2=a1;其實,真正做到的只是複製了一個引用,使a2指向a1的首地址。此時若a1中元素值改變,則a2中對應元素也必然會改變。可用如下例子進行驗證: int[] a1=new int[5];
for(int i=0;i<a1.length;i++)
a1[i]=i;
int[] a2;
a2=a1;
for(int i=0;i<a2.length;i++)
a2[i]++;
for(int i=0;i<a1.length;i++)
System.out.println("a1["+i+"]="+a1[i]);輸出結果依次為:1,2,3,4,5,可以發現a2中元素改變,a1中元素跟著改變。如果想使a2與a1無關聯,即a1的值賦給a2後,a1中元素再改變,a2中對應元素不受影響,可以使用如下方法: int[] a1=new int[5];
for(int i=0;i<a1.length;i++)
a1[i]=i;
int[] a2 = new int[5];
System.arraycopy(a1,0,a2,0,a1.length);
for(int i=0;i<a2.length;i++)
a2[i]++;
for(int i=0;i<a1.length;i++)
System.out.println("a1["+i+"]="+a1[i]);此時,輸出結果將依次為:0,1,2,3,4但是需要注意的是,如果用System.arraycopy()方法,則a2必須被初始化。否則,會報出null 指標的異常。利用System.arraycopy()方法複製要比利用for()迴圈複製數組快很多。
數組的比較排序數組的比較排序,可以直接利用Arrays.sort()方法,不需要自己寫函數,如要實現一個字串數組的正序排列,則用如下程式即可: String[] b2=...{"b","e","c","d"};
Arrays.sort(b2);
for(int i=0;i<b2.length;i++)
System.out.println("b2["+i+"]="+b2[i]);若要實現反序排列,則可以使用如下方式:
String[] b1=...{"b","e","c","d"};
Arrays.sort(b1,Collections.reverseOrder());
for(int i=0;i<b1.length;i++)
System.out.println("b1["+i+"]="+b1[i]);
筆者以前曾經為了實現字串數組排序,自己寫了個方法,參考:java中字串操作方法整理,顯然那個方法更麻煩一些。其它Arrays中還有兩個方法值得注意,分別是:Fill()用於以某個值填充整個數組binarySearch()用於在排好序的數組中尋找某個元素。