歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中的ArrayList

各種原因,前兩年做C語言去了,現在重新做JAVA, 感覺自己基礎很不扎實,要好好學習啦, 先從簡單的開始~

以下內容基於jdk1.7.0_79源碼;

什麼是ArrayList

可以簡單的認為是一個動態數組;實際上ArrayList就是用數組實現的,長度不夠時,調用Arrays.copyOf方法,拷貝當前數組到一個新的長度更大的數組;

ArrayList特點

隨機訪問速度快,插入和移除性能較差(數組的特點);

支持null元素;

有順序;

元素可以重復;

線程不安全;

ArrayList繼承的類和實現的接口

如下圖,是與ArrayList相關的接口和類,下面將一一介紹各個接口和類中的方法;

PS:ArrayList中的方法主要是由Collection接口和List接口定義的;

Iterable接口

實現此接口以便支持foreach語法,如下代碼,ArrayList可以直接使用foreach語句遍歷元素:

package com.pichen.basis.col;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0; i < 10; i++){
            list.add(i);
        }
       
        //foreach語法
        for(Integer i : list){
            System.out.print(i.toString() + " ");
        }
       
    }
}

 

Collection接口

int size()方法:

返回集合的大小,在ArrayList類中有一個int類型的size私有屬性,當調用size方法時,直接返回該屬性;

boolean isEmpty()方法:

判斷集合是否為空,在ArrayList中,通過判斷size == 0來判斷集合是否為空;

boolean contains(Object o)方法:

判斷集合是否含有對象o,在ArrayList中,通過判斷indexOf(o) >= 0來判斷是否含有o對象;

查看indexOf(o)方法,代碼如下,主要功能是返回元素第一次出現時的下標索引,所以當下標索引大於等於0時,表示集合中存在該元素:

    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;
    }

注意這裡的相等判斷,調用的是o對象的equals方法,所以在調用contains方法時,要特別關注集合中對象的equals方法,是否有被重寫過,如Integer、String的equals方法是被重寫過的,一般我們自己定義的對象,如果沒重寫equals的話,默認調用的是Object的equals方法,舉個例子,看一下就明白了:

package com.pichen.basis.col;

import java.util.ArrayList;
import java.util.List;

class Dog{
}
public class ContainsTest {

    public static void main(String[] args) {
        List<Dog> dogList = new ArrayList<Dog>();
        Dog dog1 = new Dog();
        Dog dog2 = new Dog();
        dogList.add(dog1);
        System.out.println(dogList.contains(dog2));//false
       
        List<String> strList = new ArrayList<String>();
        strList.add("teststr");
       
        String str = new String("teststr");
        System.out.println(strList.contains(str));//true
       
    }

}

Iterator<E> iterator()方法:

返回一個迭代器對象,用於遍歷集合,事實上,ArrayList類裡有兩個內部類ArrayList.Itr和ArrayList.ListItr,分別對應Iterator迭代器和ListIterator迭代器,後者比前者功能更加強大;從ArrayList.ListItr繼承自ArrayList.Itr就可以看出來,ListIterator迭代器支持更多的操作,如判斷前面還有沒有元素,即hasPrevious()方法,等;

Object[] toArray()方法:

將集合ArrayList轉換成Object數組,有時候需要用到數組的一些api時,可以使用該方法,注意返回的結果是Object類型的數組,如果想返回指定類型的數組,可以使用以下方法,<T> T[] toArray(T[] a);

<T> T[] toArray(T[] a)方法:

集合轉數組,返回指定類型的數組,注意入參T[] a需要指定數組存儲的空間,返回值為指定類型的數組;舉個例子,假如有一個Integer類型的集合,如果想把它轉換成Integer類型的數組,可以這樣寫:Integer[] arr = list.toArray(new Integer[list.size()]);

boolean add(E e)方法:

在集合最後面增加一個元素,在ArrayList中,其實現就是在其內部數組後面增加一個元素,不過要先保證內部數組長度足夠,如下代碼:

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

boolean remove(Object o)方法:

在集合中移除對象o,在ArrayList中,其實現較add方法復雜,涉及空對象判斷,equals比較,數組移動等,性能相對較差;

boolean containsAll(Collection<?> c)方法:

判斷是否包含集合c中的所有元素,在ArrayList中,其實現方法是遍歷集合c中的每一個元素,調用contains方法,判斷集合是否包含該元素,只要有一個不包含就返回false,如下代碼:

    public boolean containsAll(Collection<?> c) {
        for (Object e : c)
            if (!contains(e))
                return false;
        return true;
    }

boolean addAll(Collection<? extends E> c)方法:

將集合c中的所有元素加到目標集合中去,在ArrayList中,其實現是先將集合c轉換成數組,然後通過數組拷貝實現;

boolean removeAll(Collection<?> c)方法:

移除目標集合中含有‘集合c中元素’的所有元素,在ArrayList中,最終還是操作數組,性能相對較差;

boolean retainAll(Collection<?> c)方法:

移除目標集合中‘不包含集合c中元素’的所有元素,在ArrayList中removeAll方法和retainAll方法都是通過調用ArrayList的batchRemove方法來實現的,後續詳細了解該方法的實現;

void clear()方法:

移除目標集合中的所有元素,在ArrayList中,就是將其內部數組所有元素賦null;

boolean equals(Object o)和int hashCode()方法

在ArrayLisy中,上面兩個方法都被重寫,equals方法依次取出集合中的所有元素進行比較,通過元素的equals方法,判斷是否相等,全部相等返回true;

hashCode方法的計算是通過所有元素的hashCode計算得到;順便說下hashcode,在java中隨處可見,一般用在HashMap, Hashtable, HashSet等等中,可用於減少equals方法的調用,快速訪問元素等,其實就是散列表的概念,如比較元素先比較其hashcode,如果hashcode不相等,那麼這兩個元素肯定不相等,也就不用調用其equals方法了;

demo代碼:以上方法的簡單使用

package com.pichen.basis.col;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0; i < 10; i++){
            list.add(i);
        }
       
        //直接打印
        System.out.println(list.toString());
       
        //size()
        System.out.println(list.size());
       
        //contains
        System.out.println(list.contains(2));
       
        //iterator
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next() + " ");
        }
       
        //toArray
        Object[] objArr = list.toArray();
        Integer[] intArr = list.toArray(new Integer[list.size()]);
        System.out.println("\n" + list.toArray());
       
        //add
        list.add(5);
       
        //remove
        list.remove(5);
       
        System.out.println(list);
       
        //containsAll
        System.out.println(list.containsAll(Arrays.asList(5,6)));
       
        //addAll
        list.addAll(Arrays.asList(555,666));
        System.out.println(list);
       
        //removeAll
        list.removeAll(Arrays.asList(555,666));
        System.out.println(list);
       
        //clear
        list.clear();
        System.out.println(list);
       
    }
}

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-03/129092p2.htm

Copyright © Linux教程網 All Rights Reserved