大家知道,集合框架是為了表示和操作集合而規定的一種統一的標准的體系結構,學習集合知識有利於我們解決一系列例如保存數據與對象的問題。
常用的集合在系統中定義了兩大接口,List和Set
這裡我們就來討論一下List 的定義以及一些常見的問題
List定義的是有序的並且數據可以重復的集合,我們先看一下下面這段代碼:
import java.util.ArrayList; import java.util.List; publicclass ListTest{ publicstaticvoid main(String args[]){ ListTest lt=new ListTest(); List list=new ArrayList(); for(int i=0;i<5;i++){ list.add(i); } for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } }
這段代碼在Eclipse中是可以運行的,但是我們在cmd(命令提示符)中編譯這段代碼的時候就會發現,上面會顯示這樣一段文字
注: ListTest.java使用了未經檢查或不安全的操作。
注: 有關詳細信息, 請使用 -Xlint:unchecked 重新編譯。
這說明我們在List定義的時候沒有指定類型,而Eclipse在執行的時候自動為List指定了泛型,所以在編譯的時候才不會出錯,為了解決這樣的錯誤,我們應該這樣定義
List<Object> list=newArrayList<Object>();
這裡所說的有序並不是說在List定義好之後,裡面的元素就已經排好順序,而是按照List中插入元素的順序。在List定義的時候,我們要使用List的實現類,上面一段代碼已經展示了ArrayList的實現方法,這裡的ArrayList就像我們所熟悉的數組,裡面也包含了包括數組的插入,添加元素等等操作,需要注意的是,由於ArrayList采用的是線性操作,從性能的觀點來看,在很多實現中,它們將執行高開銷的線性搜索。
查看本欄目
ArrarList中的構造方法裡面寫的一句話很有意思,ArrayList()是構造一個初始容量為 10 的空列表。但是我們如果不對ArrayList中添加元素,如下:
import java.util.ArrayList; import java.util.List; publicclass ListTest{ publicstaticvoid main(String args[]){ List<Object> list=new ArrayList<Object>(); System.out.println(list.size()); } }
我們會發現輸出的list長度並不是10,而是0;這是由於size方法返回的是List中的元素的個數,而我們並沒有對List中添加元素,所以長度為0。
為了解決ArrayList中的插入與刪除操作所進行的時間復雜度較大的隊列重新排序的操作,我們可以定義LinkedList來實現List方法,當一個新節點插入時,只需要修改其中保持先後關系的節點的引用即可,當刪除記錄時也一樣,所有操作都是按照雙重鏈接列表的需要執行的。在列表中編索引的操作將從開頭或結尾遍歷列表(從靠近指定索引的一端)。
注意,此實現不是同步的。如果多個線程同時訪問一個鏈接列表,而其中至少一個線程從結構上修改了該列表,則它必須保持外部同步。
所以,這樣所實現的List是不能隨即訪問的,雖然提供了get()方法,但是這個方法是通過遍歷結點來定位的,所以速度比較慢。