Java集合詳解

一、集合簡介

集合本質是基於某種數據結構數據容器。常見的數據結構:數組(Array)、集(Set)、隊列 (Queue)、鏈表(Linkedlist)、樹(Tree)、堆(Heap)、棧(Stack)和映射(Map)等結構。

Java中提供了豐富的集合接口和類,它們來自於java.util包。如圖所示是Java主要的集合接口和 類,從圖中可見Java集合類型分爲:Collection和Map,Collection子接口有:Set、Queue和List等接口。 每一種集合接口描述了一種數據結構。
在這裏插入圖片描述
在Java SE中List名稱的類型有兩個,一個是java.util.List,另外一個是java.awt.List。 java.util.List是一個接口,而java.awt.List是一個類,用於圖形用戶界面開 發,它是一個圖形界面中的組件。學習Java中的集合,首先從兩大接口入手,重點掌握List、Set和Map三個接口,熟悉這些接 口中提供的方法。然後再熟悉這些接口的實現類,並瞭解不同實現類之間的區別。

二、List集合

List集合中的元素是有序的,可以重複出現。List接口的實現類有:ArrayList 和 LinkedList。ArrayList是基於動態數組數據結構的實現,LinkedList 是基於鏈表數據結構的實現。ArrayList訪問元素速度優於LinkedList,LinkedList佔用的內存空間比較 大,但LinkedList在批量插入或刪除數據時優於ArrayList。

(1)常用方法

List接口繼承自Collection接口,List接口中的很多方法都繼承自Collection接口的。List接口中常用方法如下。

  1. 操作元素
    get(int index):返回List集合中指定位置的元素。
    set(int index, Object element):用指定元素替換List集合中指定位置的元素。
    add(Object element):在List集合的尾部添加指定的元素。該方法是從Collection集合繼承 過來的。
    add(int index, Object element):在List集合的指定位置插入指定元素。 remove(int index):移除List集合中指定位置的元素。
    remove(Object element):如果List集合中存在指定元素,則從List集合中移除第一次出現的 指定元素。該方法是從Collection集合繼承過來的。
    clear():從List集合中移除所有元素。該方法是從Collection集合繼承過來的。
  2. 判斷元素
    isEmpty():判斷List集合中是否有元素,沒有返回true,有返回false。該方法是從 Collection集合繼承過來的。
    contains(Object element):判斷List集合中是否包含指定元素,包含返回true,不包含返回 false。該方法是從Collection集合繼承過來的。
  3. 查詢元素
    indexOf(Object o):從前往後查找List集合元素,返回第一次出現指定元素的索引,如果
    此列表不包含該元素,則返回-1。
    lastIndexOf(Object o):從後往前查找List集合元素,返回第一次出現指定元素的索引,如果此列表不包含該元素,則返回-1。
  4. 其他
    iterator():返回迭代器(Iterator)對象,迭代器對象用於遍歷集合。該方法是從Collection 集合繼承過來的。
    size():返回List集合中的元素數,返回值是int類型。該方法是從Collection集合繼承過來 的。
    subList(int fromIndex, int toIndex):返回List集合中指定的 fromIndex(包括 )和 toIndex(不包括)之間的元素集合,返回值爲List集合。
    代碼如下:
package 集合.list集合;
import	java.util.ArrayList;
import java.util.List;
//list集合:有序,重複
public class HelloWorld {
    public static void main(String[] args) {
//
        List list = new ArrayList();
        String b = "B";
//       向集合中添加元素
        list.add("A");
        list.add(b);
        list.add("C");
        list.add(b);
        list.add("D");
        list.add("E");

//        打印集合的元素個數
        System.out.println("集合 size = "+list.size());
//        打印集合
        System.out.println(list);
//從前往後查找b元素
        System.out.println("indexOf(\"B\") = " +list.indexOf(b));
//       從後往前查找"B"元素
        System.out.println("lastindexOf(\"B\") = " +list.lastIndexOf(b));
        //刪除集合中第一個"B"元素
        list.remove(b);
        System.out.println("remove(3)前: "+list);
        //判斷集合中是否包含"B"元素
        System.out.println("是否包含\"B\":" + list.contains(b));

        //刪除集合第4個元素
        list.remove(3);
        System.out.println("remove(3)後: " + list);

        //判斷集合是否爲空
        System.out.println("list集合是空的:" + list.isEmpty());

        System.out.println("替換前:" + list); //替換集合第2個元素
        list.set(1, "F");
        System.out.println("替換後:" + list);

        //清空集合
        list.clear();
        System.out.println(list);

        // 重新添加元素
        list.add(1);// 發生自動裝箱
        list.add(3);
        
        int item = (Integer)list.get(0);//發生自動拆箱
    }
}

運行結果:

集合 size = 6
[A, B, C, B, D, E]
indexOf("B") = 1
lastindexOf("B") = 3
remove(3): [A, C, B, D, E]
是否包含"B":true
remove(3): [A, C, B, E]
list集合是空的:false
替換前:[A, C, B, E]
替換後:[A, F, B, E]
[]

(2)遍歷集合

集合最常用的操作之一是遍歷,遍歷就是將集合中的每一個元素取出來,進行操作或計算。List集合遍歷有三種方法:

  1. 使用for循環遍歷:List集合可以使用for循環進行遍歷,for循環中有循環變量,通過循環變量可
    以訪問List集合中的元素。
  2. 使用for-each循環遍歷:for-each循環是針對遍歷各種類型集合而推出的,筆者推薦使用這種遍歷
    方法。
  3. 使用迭代器遍歷:Java提供了多種迭代器,List集合可以使用Iterator和ListIterator迭代器。
    代碼如下:
package 集合.list集合遍歷;

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

public class HelloWorld {
    public static void main(String[] args) {
        List list = new ArrayList();

        String b = "B";
//       向集合中添加元素
        list.add("A");
        list.add(b);
        list.add("C");
        list.add(b);
        list.add("D");
        list.add("E");

//        打印集合
        System.out.println(list);
//        for循環遍歷集合
        System.out.println("--1.使用for循環遍歷--");
        for (int i = 0;i<list.size();i++){
//            System.out.println(list.get(i));
            System.out.printf("讀取集合元素(%d): %s \n", i, list.get(i));
        }
        // 2.使用for-each循環遍歷
        System.out.println("--2.使用for-each循環遍歷--");
        for (Object items:list){
            String s = (String) items;
            System.out.println("讀取集合元素:"+s);
        }

        // 3.使用迭代器遍歷
        System.out.println("--3.使用迭代器遍歷--");
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            Object items = iterator.next();
            String s = (String)items;
            System.out.println("讀取集合元素:"+s);
        }
    }
}

運行結果:

[A, B, C, B, D, E]
--1.使用for循環遍歷--
讀取集合元素(0): A 
讀取集合元素(1): B 
讀取集合元素(2): C 
讀取集合元素(3): B 
讀取集合元素(4): D 
讀取集合元素(5): E 
--2.使用for-each循環遍歷--
讀取集合元素:A
讀取集合元素:B
讀取集合元素:C
讀取集合元素:B
讀取集合元素:D
讀取集合元素:E
--3.使用迭代器遍歷--
讀取集合元素:A
讀取集合元素:B
讀取集合元素:C
讀取集合元素:B
讀取集合元素:D
讀取集合元素:E

二、Set集合

Set集合是由一串無序的,不能重複的相同類型元素構成的集合。List集合強調的是有序,Set集合強調的是不重複。當不考慮順序,且沒有重複元素時,Set集合和List集 合可以互相替換的。Set接口直接實現類主要是HashSet,HashSet是基於散列表數據結構的實現。

(1)常用方法

Set接口也繼承自Collection接口,Set接口中大部分都是繼承自Collection接口,這些方法如下。

  1. 操作元素
    add(Object element):在Set集合的尾部添加指定的元素。該方法是從Collection集合繼承過來的。
    remove(Object element):如果Set集合中存在指定元素,則從Set集合中移除該元素。該方法是從Collection集合繼承過來的。
    clear():從Set集合中移除所有元素。該方法是從Collection集合繼承過來的。
  2. 判斷元素
    isEmpty():判斷Set集合中是否有元素,沒有返回true,有返回false。該方法是從 Collection集合繼承過來的。
    contains(Object element):判斷Set集合中是否包含指定元素,包含返回true,不包含返回 false。該方法是從Collection集合繼承過來的。
  3. 其他
    iterator():返回迭代器(Iterator)對象,迭代器對象用於遍歷集合。該方法是從Collection
    集合繼承過來的。
    size():返回Set集合中的元素數,返回值是int類型。該方法是從Collection集合繼承過來的。
    代碼如下:
//set集合:無序,不重複
import java.util.HashSet;

public class Set {
    public static void main(String[] args) {
        java.util.Set set = new HashSet();

        String b = "B";
// 向集合中添加元素
        set.add("A");
        set.add(b);
        set.add("C");
        set.add(b);
        set.add("D");
        set.add("E");
//        打印集合個數
        System.out.println("集合size = "+set.size());
//        打印集合
        System.out.println(set);
//       刪除集合中的B元素
        set.remove(b);
//        判斷集合中是否包含"B"元素
        System.out.println("判斷是否包含B元素"+set.contains(b));
//        判斷集合是否爲空
        System.out.println("判斷集合是否爲空"+set.isEmpty());
//        清空集合
        set.clear();
        //        打印集合
        System.out.println(set);
    }
}

運行結果:

集合size = 5
[A, B, C, D, E]
判斷是否包含B元素false
判斷集合是否爲空false
[]

(2)遍歷集合

Set集合中的元素由於沒有序號,所以不能使用for循環進行遍歷,但可以使用for-each循環和迭代器進 行遍歷。事實上這兩種遍歷方法也是繼承自Collection集合,也就是說所有的Collection集合類型都有這 兩種遍歷方式。
代碼如下:

public class Bianli {
    public static void main(String[] args) {
        Set set = new HashSet();
        String b = "B";
// 向集合中添加元素
        set.add("A");
        set.add(b);
        set.add("C");
        set.add(b);
        set.add("D");
        set.add("E");

        //        打印集合
        System.out.println(set);
//        1,使用增強for遍歷
        System.out.println("--1,使用增強for遍歷--");
        for (Object item : set){
            String s = (String)item;
            System.out.println(s);
        }
//        2.使用迭代器遍歷集合
        System.out.println("--2.使用迭代器遍歷集合--");
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            Object item  = iterator.next();
            String s = (String)item;
            System.out.println("讀取集合"+s);
        }

    }
}

運行結果:

[A, B, C, D, E]
--1,使用增強for遍歷--
A
B
C
D
E
--2.使用迭代器遍歷集合--
讀取集合A
讀取集合B
讀取集合C
讀取集合D
讀取集合E

三、Map集合

Map(映射)集合表示一種非常複雜的集合,允許按照某個鍵來訪問元素。Map集合是由兩個集合構 成的,一個是鍵(key)集合,一個是值(value)集合。鍵集合是Set類型,因此不能有重複的元素。 而值集合是Collection類型,可以有重複的元素。Map集合中的鍵和值是成對出現的。Map接口直接實現類主要是HashMap,HashMap是基於散列表數據結構的實現。

(1)常用方法

Map集合中包含兩個集合(鍵和值),所以操作起來比較麻煩,Map接口提供很多方法用來管理和操 作集合。主要的方法如下。

  1. 操作元素
    get(Object key):返回指定鍵所對應的值;如果Map集合中不包含該鍵值對,則返回null。 put(Object key, Object value):指定鍵值對添加到集合中。
    remove(Object key):移除鍵值對。
    clear():移除Map集合中所有鍵值對。
  2. 判斷元素
    isEmpty():判斷Map集合中是否有鍵值對,沒有返回true,有返回false。
    containsKey(Object key):判斷鍵集合中是否包含指定元素,包含返回true,不包含返回false。
    containsValue(Object value):判斷值集合中是否包含指定元素,包含返回true,不包含返回false。
  3. 查看集合
    keySet():返回Map中的所有鍵集合,返回值是Set類型。
    values():返回Map中的所有值集合,返回值是Collection類型。
    size():返回Map集合中鍵值對數。
    代碼如下:
package 集合.map集合;

import java.util.HashMap;

public class Map {
    public static void main(String[] args) {
        java.util.Map map = new HashMap();

        map.put(101,"A");
        map.put(102, "B");
        map.put(103, "C");
        map.put(104, "D");
//        B重複
        map.put(105, "B");
//把102的值換成E
        map.put(102, "E");
//        打印集合
        System.out.println(map);
//        打印集合元素個數
        System.out.println("集合size="+map.size());
//        通過鍵取值
        System.out.println("102-"+map.get(102));
        System.out.println("105-"+map.get(105));
//        刪除鍵值對
        map.remove(102);
        System.out.println(map);
//        判斷集合中是否包含105
        System.out.println("集合中是否包含102"+map.containsKey(105));
//        集合中是否包含"A"
        System.out.println("集合中是否包含A"+map.containsValue("A"));
//        判斷集合是否爲空
        System.out.println("集合是否爲空"+map.isEmpty());
//        清空集合
        map.clear();
        System.out.println(map);
    }
}

運行結果:

{101=A, 102=E, 103=C, 104=D, 105=B}
集合size=5
102-E
105-B
{101=A, 103=C, 104=D, 105=B}
集合中是否包含102true
集合中是否包含Atrue
集合是否爲空false
{}

(2)遍歷集合

Map集合遍歷與List和Set集合不同,Map有兩個集合,因此遍歷時可以只遍歷值的集合,也可以只遍歷鍵的集合,也可以同時遍歷。這些遍歷過程都可以使用for-each循環和迭代器進行遍歷。
代碼如下:

package 集合.map集合遍歷;

import java.util.*;

public class Mapbianli {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put(101,"A");
        map.put(102, "B");
        map.put(103, "C");
        map.put(104, "D");
//        使用增強for循環遍歷
        System.out.println("使用增強for循環遍歷");
//        獲得鍵集合
        Set keys  = map.keySet();
        for (Object key:keys){
//            自動拆箱
            int ikey = (Integer) key;
//            自動裝箱
            String value = (String)map.get(ikey);
            System.out.printf("key=%d-value=%s \n",ikey,value);
        }
//        使用迭代器遍歷集合
        System.out.println("使用迭代器遍歷集合");
//        獲得值集合
        Collection values = map.values();
//        遍歷值集合
        Iterator iterator = values.iterator();
        while (iterator.hasNext()){
            Object item = iterator.next();
            String s = (String)item;
            System.out.println("集合元素集合:"+s);
        }
    }
}

運行結果:

使用增強for循環遍歷
key=101-value=A 
key=102-value=B 
key=103-value=C 
key=104-value=D 
使用迭代器遍歷集合
集合元素集合:A
集合元素集合:B
集合元素集合:C
集合元素集合:D

以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

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