詳解JAVA高品質代碼之數組與集合_java

來源:互聯網
上載者:User

  1.效能考慮,優先選擇數組

  數組在項目開發當中使用的頻率是越來越少,特別是在業務為主的開發當中,首先數組沒有List,Set等集合提供的諸多方法,尋找增加演算法都要自己編寫,極其繁瑣麻煩,但由於List,Set等集合使用泛型支援後,存放的都為封裝類,而數組是可以使用基礎資料型別 (Elementary Data Type),而使用基礎資料型別 (Elementary Data Type)的執行運算速度要比封裝類型快得多,而且集合類的底層也是通過數組進行實現.

  2.若有必要,使用變長數組

  在學習集合類當中,很多人喜歡將數組的定長拿來和集合類型的自變長來做比較,但其實這種比較並不合適,通過觀察集合類例如ArrayList的實現其實可以看出,所謂的集合變長,其實只是用婉轉的方式對原數組進行了擴容

  

複製代碼 代碼如下:

  public static T[] expandCapacity(T[] data, int newLength) {

  // 判斷是否為負值

  newLength = newLength < 0 ? 0 : newLength;

  // 產生新數組,拷貝原值並制定長度

  return Arrays.copyOf(data, newLength);

  }
 


  當效能要求高的時候,可以考慮使用對數組進行封裝使用,數組長度不變不是我們不使用它們的借口

  3.警惕數組的淺拷貝

  數組的淺拷貝在Java編程中亦是基礎中的基礎,淺拷貝是在為數組拷貝時,基本類型拷貝的是值,而參考型別拷貝的是引用地址,在上面的例子當中,拷貝數組使用的Arrays.copyOf為淺拷貝,在使用時需要注意

  4.在明確的情境下,為集合指定初始容量

  在我們平常的使用當中,因為集合類型是自動變長的,所以基本建立對象時不會為集合類附上初始值,就拿我們最常用的ArrayList來說明,我們首先要知道,當集合容量到達臨界點時,會將底層的數組進行copyOf的操作,產生新的數組,而新的數組容量為舊數組的1.5倍,而預設數組長度為10,當我們明確知道要放置入容器中的資料數量較多時,應該指明初始值,避免多次使用copyOf造成的效能開銷

  5.選擇合適的最值演算法

  對資料進行最大值或最小值的尋找,這是資料結構最基本的知識,在Java當中我們亦有很多種的方式進行實現,以下列舉2種演算法

  

複製代碼 代碼如下:

  public static int getMaxByArray(int[] data) {

  // 最簡單自行實現的尋找方式

  int max = data[0];

  for (int i = 1, size = data.length; i < size; i++) {

  max = max < i ? i : max;

  }

  return max;

  }


複製代碼 代碼如下:

  public static int getMaxByArray(int[] data) {

  // 先排序後擷取最後位

  Arrays.sort(data);

  return data[data.length - 1];

  }


  6.基本類型數群組轉換陷阱!

  請觀察以下代碼

複製代碼 代碼如下:

  public static void main(String[] args) {

  int[] nums = new int[] { 1, 2, 3, 4, 5 };

  List list = Arrays.asList(nums);

  System.out.println(list.size());

  // 此時輸出的size為1

  }


  我們期望的結果是將數組中的元素通過Arrays.asList轉換到集合類當中,但事與願違,我們只將數組本身增加了進入,並沒有將數組內的值分拆分開來,此時若然對集合List增加了泛型就會在編譯期間給出錯誤的提示,或將數組本身改變成Integer就可以解決問題

  7.asList方法產生的List對象不可更改

  通過上面的例子,我們可以看到使用Arrays.asList方法可以將一個數群組轉換成一個List,那通過asList方法返回的List有什麼特別呢?注意,這個返回的List是不支援更改的,原因是因為asList方法返回的,並不是java.util.ArrayList,而是Arrays工具類中的一個靜態私人內部類,雖然都有實現和ArrayList一樣的父類AbstractList,但在複寫add等方法時,卻是拋出了UnsupportedOperationException,這個靜態私人內部類只實現了size,toArray,get,contains這幾個方法

  8.對不同的資料結構使用不同的遍曆方式

  請觀看以下代碼

複製代碼 代碼如下:

  public static void main(String[] args) {

  // 以下為ArrayList集合的遍曆方式

  int num = 80 * 10000;

  List arrayList = new ArrayList(num);

  for (int i = 0, size = arrayList.size(); i < size; i++) {

  arrayList.get(i);

  }

  // 以下為LinkedList集合的遍曆方式

  List linkedList = new LinkedList();

  for (Integer integer : linkedList) {

  }

  }


  為什麼對LinkedList和ArrayList要選擇不同的遍曆方式?

  1.因為ArrayList實現了RamdomAccess介面(隨機存取介面),RamdomAccess介面和Serializable,Cloneable介面一樣是Java中的標示介面,代表這個這個類可以隨機存取,對ArrayList來說就標誌著,資料之間沒有關聯,即相鄰的兩個位置沒有互相依賴的關係,可以隨機訪問,

  2.Java中的foreach文法是iterator(迭代器)的變形用法,我們知道迭代器是23種設計模式的一種,但迭代器是需要知道兩個元素時間的關係的,不然怎麼提供hasNext的支援呢?就是因為上一個元素要判斷下一個元素是否存在,強行建立了這種關係,違背了ArrayList隨機存取的特別

  3.在LinkedList中,因為是通過雙向鏈表的形式來儲存,所以對迭代器的支援非常好,因為LinkedList相鄰的兩個元素本來就存在關係所以在對LinkedList和ArrayList要採取不同的遍曆方式,讀者若然有興趣可以嘗試一下對LinkedList採用下標的形式訪問,會發現兩者的效率有較大的差距

  8.適時選擇ArrayList或LinkedList

  ArrayList和LinkedList的主要區別:

  1.ArrayList底層的資料結構為數組,而LinkedList底層結構為雙向鏈表

  2.在插入資料時,由於ArrayList每次插入後都需要將數組元素向後順延位置,而LinkedList只需要更改前端節點和尾節點即可完成插入操作,所以在插入操作較為頻繁時,優先使用LinkedList

  3.在刪除資料時,由於ArrayList要保持數組的有序性,當刪除後元素要亦需要向後或向前移位,而LinkedList照舊還是更改頭尾節點.

  4.在更新時,由於LinkedList會使用折半遍曆的方式進行尋找定位元素再進行更新,對比起ArrayList的直接定位下標元素替換,ArrayList對更新的效率更佳

  5.LinkedList可以類比隊列,通過LinkedList的addFirst,addLast等操作

  9.列表相等只需關心元素資料

  Java為了我們可以安心的面向List,Set,Map等介面進行編程,因此對集合類中的equlas進行了複寫,讓我們在比較兩個集合是否相等時,只需要比較元素資料是否相等即可,避免了因為替換集合實作類別造成的錯誤Java代碼

複製代碼 代碼如下:

  public static void main(String[] args) {

  List arrayList = new ArrayList();

  arrayList.add(1);

  arrayList.add(2);

  List linkedList = new LinkedList();

  linkedList.add(1);

  linkedList.add(2);

  System.out.println(arrayList.equals(linkedList));

  // 不用關心具體實現,輸出為true

  }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.