瞭解數組列表ArrayList

Java裏面的數組列表ArrayList

ArrayList是一個類,該類繼承與接口List

在Java裏面,雖然可以動態的改變數組的大小

int size = ...;	//	可以動態改變的數
Student[] student = new Student(size);

但是該數組一旦確定了大小,就不容易改變它了。,這時,就體現出了ArrayList的優點了,它使用時,和數組差不多,在對它進行增加或者刪除元素時,會自動的調節數組的容量。不需要爲其做其他的操作

ArrayList<Student> students = new ArrayList<Student>();	//在Java SE 7之前
ArrayList<Student> students = new ArrayList<>();	//在Java SE 7及之後

上述關於Java SE 7對定義的改變,時爲了方便,因爲new操作符使用<>語法時,編譯器會檢查新值是什麼,如果複製給一個變量,或傳遞到某個方法,編譯器會檢查這個變量、參數或者方法的泛型類型,然後將這個類型放在<>中,上述代碼是給了變量 ArrayLisy,所以new後面的<>裏面也是Student,關於<>的問題,其實“=”右邊的實例如果不加<>,編譯器他也不會報錯,只會發出一個警告,但是“=”左邊一定要加<>,且裏面一定要寫類型,否者即使報錯

ArrayList其實也有有初始長度的,如果初始化時未指明其長度,則其默認長度就是10,但是這個10,和其size不是一個,size()函數獲得的是已經存在的元素的長度即個數,而初始化的10是值空間大小,即沒有存儲數據時,其也佔據着內存空間,且初始大小爲10(爲定義初始大小時)

即如果創建實例化時像上面一樣默認創建,則初始容量被設置爲10。當ArrayList中的元素超過10個以後,數組列表的容量大小即內存就會重新分配,使數組的大小增長到16,然後通過調試,我們可以發現動態增長的容量大小變化爲:10->16->25->38->…,而如果我們實例化時,指定其大小如

List arrayList = new ArrayList(6);

將ArrayList的默認容量設置爲6。當ArrayList中的元素超過6個以後,會重新分配內存空間,使數組的大小增長到10。
可以通過調試看到動態增長的數量變化:6->10->16->25->…

最後可以得出其變化規律爲n = n * 3 / 2 + 1,而不是簡單的n = n * 2;

//我們可以利用add爲其添加值,不像數組使用的是a[i] = ...;
student.add(new Student("name",id));

數組列表管理着對象引用的一個內部數組,一旦空間被用盡了,這時,數組列表的強大就體現出來了,如果你繼續add,但是,空間已經滿了,則數組列表就會自動的創建一個更大的空間的數組。然後將裏面的對象全都拷貝到新建的數組裏面,從而實現動態自動擴大的效果

一些ArrayList的常用方法

方法功能
ArrayList<>()構造一個空數組列表
ArrayList<>(int initialCapacity)構造一個空數組列表,initialCapacity數組列表的最初容量
boolean add(E obj)在數組列表的尾端添加一個元素,永遠返回true,obj爲添加的元素
int size()返回數組列表中當前元素的數量,這個值小於或等於列表的容量
trimToSize將數組列表的存儲容量削減到當前尺寸
void set(int index,E obj)設置數組列表指定位置的元素值,這個操作將覆蓋這個位置的原始內容。index:位置,obj:新的元素
E get(index)獲得指定位置的值,index:位置
void add(int index,E obj)向後移動元素,以便插入元素,index:位置,obj:新元素
E remve(int index)刪除一個元素,並將後面的元素前移,被刪除的元素由返回值i返回,index:被刪除元素的位置

trimToSize()方法,一旦確認了數組裂變的當前元素的數量,且不再改變,則可以調用該函數,它可以自動調節當前數組的存儲空間數目,垃圾回收期將回收多餘的存儲空間;

對於數組列表的訪問,它不像數組一樣,但又和數組一樣,因爲數組列表也是通過下標訪問

for(int i = 0;i < student.size();i++)
{
	System.out.println(student.get(i));	//將數組列表便利
}
//但是一般都是用for each訪問
for(Student stu : student)
	System.out.println(stu);//這個和上述代碼效果一樣

對於刪除(remove(int index))和插入(add(int index,E obj)而不是add(E obj)),這兩個函數,執行插入或者刪除時,由於是在數組的之間發生的變化,就涉及到了,動態改變裏面元素位置的變化,對其進行前移或者後移的操作,這樣效率比較低,這個時候,就應該考慮是否要使用鏈表

但是在使用ArrayList時,聲明如下,

List<Student> stu = new ArrayList<>();	//一般不使用ArrayList<Student> stu = new ArrayList<>();

前面已經說到了,ArrayList是繼承了接口List的一個類,爲什麼要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
問題就在於List接口有多個實現類,現在用的是ArrayList,或許有時候需要換成其它的實現類,如 LinkedList或者Vector等等,利用其多態性,這時你只要改變這一行就行了: List list = new LinkedList(); 其它使用了list地方的代碼根本不需要改動。 假設你開始用ArrayList alist = new ArrayList(),這是你就需要該以下ArrayList所有使用了其獨有的屬性和方法的代碼,但是在使用數組列表時,很少用到其獨有的方法,所以一般使用List除非有其他特殊的需求。

發佈了40 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章