Java容器類分析之List ArrayList Vector
List是接口,聲明了各個方法,不多說。且看ArrayList類。
ArrayList類的成員變量有Object[] elementData,int size;其中elementData數(shù)組用來存儲加入到ArrayList的對象,size為列表中實際的對象數(shù)目。ArrayList類不是線程安全的。
Vector與ArrayList的實現(xiàn)基本相同,只是Vector類是線程安全的,其方法都帶有synchronized關(guān)鍵字,如果不考慮線程同步的話,ArrayList性能要好一些。當(dāng)前它們內(nèi)部實現(xiàn)原理都是用到對象數(shù)組來實現(xiàn),如果元素數(shù)目確定,直接用數(shù)組效率***。
簡單的用法:(后面是數(shù)據(jù)打印結(jié)果)
- public class ListDemo {
- /**
- * @param args
- */
- public static void main(String[] args) {
- List<String> list = new ArrayList<String>();
- String[] strArr = new String[3];
- boolean ret = list.add("haha");
- list.add(new String("aa"));
- list.add(null);
- System.out.println(list.size());//3
- System.out.println(ret);//true
- System.out.println(list);//[haha, aa, null]
- System.out.println(strArr);//[Ljava.lang.String;@1fee6fc
- System.out.println(strArr.getClass().getName());//[Ljava.lang.String;
- System.out.println(list.indexOf("aa"));//1
- System.out.println(list.indexOf(null));//2
- String str = list.set(1, "ee");
- System.out.println(str);//aa
- System.out.println(list);//[haha, ee, null]
- String remove = list.remove(0);
- System.out.println(remove);//haha
- System.out.println(list);//[ee, null]
- boolean result = list.remove("ff");
- System.out.println(result);//false
- result = list.remove("ee");
- System.out.println(result);//true
- System.out.println(list);//[null]
- }
- }
- public ArrayList() {
- this(10);
- }
- public ArrayList(int initialCapacity) {
- super();
- if (initialCapacity < 0)
- throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
- this.elementData = new Object[initialCapacity];
- }
- public boolean add(E e) {
- ensureCapacity(size + 1); // Increments modCount!!
- elementData[size++] = e;
- return true;
- }
- /*移除指定位置元素,注意每次移除數(shù)據(jù)都會將數(shù)組中后面數(shù)據(jù)移動來填充數(shù)組*/
- public E remove(int index) {
- RangeCheck(index);
- modCount++;
- E oldValue = (E) elementData[index];
- int numMoved = size - index - 1;
- if (numMoved > 0)
- System.arraycopy(elementData, index+1, elementData, index,
- numMoved);
- elementData[--size] = null; // index后面數(shù)據(jù)依次往前移動,將***一個位置賦值為0,讓gc來回收空間。
- return oldValue;
- }
- public void ensureCapacity(int minCapacity) {
- modCount++;//這個變量不用管。
- int oldCapacity = elementData.length; //初始時設(shè)定的數(shù)組長度
- if (minCapacity > oldCapacity) { //如果數(shù)組對象數(shù)目>初始數(shù)組長度,則需要擴(kuò)容。
- Object oldData[] = elementData;
- int newCapacity = (oldCapacity * 3)/2 + 1; //新的容量大小
- if (newCapacity < minCapacity)
- newCapacity = minCapacity;
- /*該方法會創(chuàng)建一個新的對象數(shù)組,然后調(diào)用 System.arraycopy(original, 0, copy, 0,
- Math.min(original.length, newLength));方法將源數(shù)組數(shù)據(jù)拷貝到新數(shù)組中。引用更新,指 向新的對象數(shù)組。*/
- elementData = Arrays.copyOf(elementData, newCapacity);
- }
- }
- /*將對象數(shù)組削減到當(dāng)前元素數(shù)目大小,減少存儲空間*/
- public void trimToSize() {
- modCount++;
- int oldCapacity = elementData.length;
- if (size < oldCapacity) {
- elementData = Arrays.copyOf(elementData, size);
- }
- }
- /*查找對象***出現(xiàn)的位置,若沒有找到,返回-1。由
- 代碼可知,可以在list中加入null對象,并查找到。*/
- public int indexOf(Object o) {
- if (o == null) {
- for (int i = 0; i < size; i++)
- if (elementData[i]==null)
- return i;
- } else {
- for (int i = 0; i < size; i++)
- if (o.equals(elementData[i]))
- return i;
- }
- return -1;
- }
- /*替換指定位置的元素值,返回該位置中old值*/
- public E set(int index, E element) {
- RangeCheck(index); //檢查范圍
- E oldValue = (E) elementData[index];
- elementData[index] = element;
- return oldValue;
- }
- /*返回指定位置的值*/
- public E get(int index) {
- RangeCheck(index);
- return (E) elementData[index];
- }
- private void RangeCheck(int index) {
- if (index >= size)
- throw new IndexOutOfBoundsException(
- "Index: "+index+", Size: "+size);
- }
- public int size() {
- return size;
- }
- public boolean isEmpty() {
- return size == 0;
- }
原文鏈接:http://qiemengdao.iteye.com/blog/1415761
【編輯推薦】