天天看點

黑馬程式員 Java 基礎:集合

——Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! ——-

一、概述

  Java 中的集合可以看做是類的執行個體化對象的容器,Java 中用于實作各種資料結構的接口就構成了 Java 的集合架構,如下圖。

黑馬程式員 Java 基礎:集合

  其中實作 Collection 的接口的接口有 List、set 等,List 的實作類包括 ArrayList、LinkedList,Set 的實作類有 HashSet、TreeSet 等,實作 Map 接口的類有 HashMap、TreeMap,而 Collections 和 Arrays 類中封裝的主要是一些對集合中的資料進行操作的方法。

二、集合元素操作的共性方法

  Collection 接口包含一些對集合中的元素進行添加、移除和查詢等操作的方法,其中包括以下方法:

boolean add (E e) // 向集合中添加對象 e
boolean contains(Object o) // 檢視元素中是否包含對象 o
boolean remove(Object o) //從集合彙總移除對象 o
int size() // 傳回集合中元素的個數
Iterator<E> iterator() // 傳回疊代器
           

  這些方法是 Collection 的子接口的實作類都可以使用的方法。

三、List

  實作 Collection 的子接口 List 的類的特征是集合中元素具有索引,結合中的元素是有順序的,可以存入重複元素,包含基于索引的特有方法。

void add(int index, E element) //在清單的指定位置插入指定元素 
E get(int index) //傳回清單中指定位置的元素 
int indexOf(Object o) 
//傳回此清單中第一次出現的指定元素的索引;如果此清單不包含該元素,則傳回 -1 
int lastIndexOf(Object o)
//傳回此清單中最後出現的指定元素的索引;如果清單不包含此元素,則傳回 -1 
E remove(int index) //移除清單中指定位置的元素 
E set(int index, E element) //用指定元素替換清單中指定位置的元素 
List<E> subList(int fromIndex, int toIndex)
//傳回清單中指定的 fromIndex(起始索引,包括 )和 toIndex(結束索引,不包括)之間的 List
           

(1)ArrayList

  ArrayList 是 List 的實作類之一,ArrayList 的特征在于其底層為數組結構,這意味着以 ArrayList 結構儲存的數組查詢速度較快,但是由于其每增加或删除一個元素都要對其後所有元素的索引進行修改,是以增加或删除元素操作的效率較低。

  ArrayList 在取出元素時,既可以用疊代器,也可以使用 get 方法。

// 建立 ArrayList 集合,存入字元串并進行增、删、改、查操作
class ArrayListDemo {
    public static void main (String[] args) {
        ArrayList al = new ArrayList();
        // 向 al 中存入一組字元串
        al.add("abcde");
        al.add("abcd");
        al.add("abc");
        // 查詢集合中是否包含 "abc"
        al.contains("abc");
        // 将集合中索引為 2 的元素設為 "abe"
        al.set(,"abe");
        //使用疊代器将數組中的元素全部取出
        Iterator it = al.iterator();
        //使用疊代器中的 hasNext 方法判斷是否有下一個元素
        while(it.hasNext()) {
            // 使用疊代器中的 next 方法傳回下一個元素
            it.next();
        }
        //使用 get 方法取出元素
        for(int x=;x<al.size();x++) {
            al.get(x);
        }
    }
}
           

(2)LinkedList

  LinkedList 是 List 的另一個實作類,其底層結構為連結清單,隻記錄相鄰元素關系,這種資料結構意味着其在增加或删除資料速度較快,但在查詢時速度不如 ArrayList。LinkedList 的特有方法包括:

boolean offer(E e)//将指定元素添加到此清單的末尾
boolean offerFirst(E e)//在此清單的開頭插入指定的元素 
boolean offerLast(E e)//在此清單末尾插入指定的元素 
E peek()//擷取但不移除此清單的頭(第一個元素)
E peekFirst()//擷取但不移除此清單的第一個元素;如果此清單為空,則傳回 null
E peekLast()//擷取但不移除此清單的最後一個元素;如果此清單為空,則傳回 null 
E poll()//擷取并移除此清單的頭(第一個元素) 
E pollFirst()//擷取并移除此清單的第一個元素;如果此清單為空,則傳回 null 
E pollLast()//擷取并移除此清單的最後一個元素;如果此清單為空,則傳回 null 
           

四、Set

  實作 Set 接口的集合的特征是集合中的元素是沒有順序的,不能存入重複的對象。在取出元素時要使用疊代器,且取出元素的順序不确定。

(1)HashSet

  HashSet 是 Set 的實作類之一,其根據對象的記憶體位址的哈希值判斷資料是否重複,當哈希值相同時,其會調用 equals 方法判斷對象是否相同。由于成員内容的相同對象的記憶體位址也可能不同,是以一般情況下需要在要存入的對象的類中重寫 hashCode 方法,使對象的哈希值與對象中的成員相關聯。

(2)TreeSet

  TreeSet 是 Set 的另一個實作類,其底層結構為二叉樹。

黑馬程式員 Java 基礎:集合

  TreeSet 要求存入的元素具有可比性,是以在存入的對象的類需要實作 Comparator 接口并重寫 compare 方法,或是在建立 TreeSet 集合時傳入一個實作了 Comparator 接口并重寫 compare 方法的類的對象作為比較器。

// 建立一個類,讓其實作 Comparator 接口并重寫 compare 方法
class Demo implements Comparator {
    String str = null;
    Demo (String str) {
        this.str = str;
    }
    int compare (Object o1,Object o2) {
        String s1 = (String) o1;
        String s2 = (String) o2;
        return s1.compareTo(s2);
    }
}
// 建立 TreeSet 集合,存入可比較的對象
class ArrayListDemo {
    public static void main (String[] args) {
        TreeSet al = new TreeSet();
        al.add(new Demo("abcde"));
        al.add(new Demo("abcd"));
        al.add(new Demo("abc"));
    }
}
           

五、Map

  實作 Map 接口的類的特點是集合中存在鍵和值,鍵和值存在映射關系,其特有方法包括:

V get(Object key) //傳回指定鍵所映射的值;如果此映射不包含該鍵的映射關系,則傳回 null 
V put(K key, V value)//将指定的值與此映射中的指定鍵關聯 
V remove(Object key)//從此映射中移除指定鍵的映射關系(如果存在)
Set<Map.Entry<K,V>> entrySet()//傳回此映射中包含的映射關系的 Set
Set<K> keySet()//傳回此映射中包含的鍵的 Set 
Collection<V> values()//傳回此映射中包含的值的 Collection 
           

  實作 Map 接口的集合在存入對象時需要使用 put 方法,并且可以通過傳回鍵或值的集合。

(1)HashMap

  HashMap 是 Map 接口的一個實作類,其特征為在儲存作為鍵的對象時會判斷其 hashCode 方法傳回的哈希值來判斷對象是否重複。

從 HashMap 集合中取出對象的方式有兩種,一種是通過 keySet 方法傳回鍵的 Set 集合,通過疊代器取出鍵對象,然後使用 get 方法取出值對象;另一種是通過 entrySet 方法傳回 Map.Entry 類對象的 Set 集合,然後使用 Map.Entry 類中的 getKey 和 getValue 方法取出鍵和值。

//将兩組字元串分别作為鍵和值存入 HashMap 集合
class HashMapDemo {
    public static void main (String[] args) {
        Map<String,String> hm = new HashMap<String,String>();
        hm.put("023001","Zhangsan");
        hm.put("023002","Lisi");
        hm.put("023003","Wangwu");
        //使用 Keyset 方法傳回鍵的 Set 集合
        Set<String> keyset = hm.keySet();
        //使用疊代器取出所有的鍵
        Iterator<String> it = keyset.iterator();
        while(it.hasNext()) {
            String key = it.next();
            //使用 get 方法取出所有的值
            String value = hm.get(key);
        }
        //使用 entrySet 方法傳回 Map.Entry 類對象的 Set 集合
        Set<Map.Entry<String,String>> entrySet = hm.entrySet();
        //使用疊代器取出每項的值,然後使用 getValue 取出每項的值
        Iterator<Map.Entry<String,String>> it = entrySet.iterator;
        while(it.hasNext()) {
            Map.Entry<String,String> me = it.next();
            String value = me.getValue();
        }
    }
}
           

(2)TreeMap

  TreeMap 是 Map 的另一個實作類,TreeMap 集合中元素的存入和取出方法類似于 HashMap 集合,所不同的的是其要求作為鍵的對象具有可比性,其實作方式與 TreeSet 集合存入元素的方式相同。

六、泛型

  泛型用于限定集合中存入的元素的類型,使用泛型指定集合中存入的元素類型後,可以提高集合的安全性,并避免在使用集合元素時使用強制類型轉換,在使用泛型後,上文中作為 TreeSet 元素的對象的類可以改寫為:

// 使用泛型限定比較器中比較的資料的類型
class Demo implements Comparator<String> {
    String str = null;
    Demo (String str) {
        this.str = str;
    }
    int compare (String s1,String s2) {
        return s1.compareTo(s2);
    }
}
           

七、集合工具類

  Collections 和 Arrays 類主要提供對集合和數組進行操作的靜态方法可以直接使用類名調用。

// 使用 Collections 和 Arrays 類中的方法操作集合和數組
import java.util.*;
Class Demo {
    public static void main (String[] args) {
        List<String> li = new ArrayList();
        li.add("abcde");
        li.add("abcef");
        li.add("abde");
        //二分查找制定對象
        int index = Collections.binarySearch(li,"abde");
        //傳回最大元素
        String s = Collections.max(li);
        //反轉順序
        Collections.reverse(li);
        //排序
        Collections.sort(li);
        //傳回線程安全的集合
        li = Collections.sort(li);
        int arr[] = {,,,,};
        //對數組進行排序
        Arrays.sort(arr);
    }
}