天天看點

Java集合詳解(List,Set,Map)1 集合概述2 Collection接口3 Map集合

目錄

  • 1 集合概述
  • 2 Collection接口
    • 2.1 Collection接口概述
    • 2.2 Collection接口常用方法
      • 2.2.1 List集合
        • 2.2.1.1 List接口
        • 2.2.1.2 List接口的實作類
        • 2.2.1.3 List集合案例
      • 2.2.2 Set集合
        • 2.2.2.1 Set接口
        • 2.2.2.2 Set接口的實作類
        • 2.2.2.3 TreeSet接口案例
  • 3 Map集合
    • 3.1 概述
    • 3.2 Map接口
    • 3.3 Map接口的實作類
    • 3.3.1 HashMap類
    • 3.3.2 TreeMap類

1 集合概述

java.util包中提供了一些集合類,這些集合類又被稱為容器。

集合和數組的差別:

  1. 數組的長度是固定的,集合的長度是可變的。
  2. 數組存儲的是同一類型的元素,可以存儲基本類型;集合存儲的是對象的引用,對象類型可以不一緻,但不可以存儲基本類型。

集合按照其存儲結構可以分為兩大類,分别是單列集合

java.util.Collection

和雙列集合

java.util.Map

集合類的繼承關系如圖所示:

Java集合詳解(List,Set,Map)1 集合概述2 Collection接口3 Map集合

2 Collection接口

2.1 Collection接口概述

  1. 所有單列集合類的根接口,用于存儲一系列符合某種規則的元素,它有兩個重要的子接口,分别是

    java.util.List

    java.util.Set

  2. List

    的特點是元素有序、元素可重複,

    List

    接口的主要實作類有

    java.util.ArrayList

    java.util.LinkedList

  3. Set

    的特點是元素無序,元素不可重複,

    Set

    接口的主要實作類有

    java.util.HashSet

    java.util.TreeSet

Collection

接口定義着單列集合架構中最共性的内容。

2.2 Collection接口常用方法

Collection是所有單列集合的父接口,是以在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合。方法如下:

  • public boolean add(E e)

    : 把給定的對象添加到目前集合中 。
  • public void clear()

    :清空集合中所有的元素。
  • public boolean remove(E e)

    : 把給定的對象在目前集合中删除。
  • public boolean contains(E e)

    : 判斷目前集合中是否包含給定的對象。
  • public boolean isEmpty()

    : 判斷目前集合是否為空。
  • public int size()

    : 傳回集合中元素的個數。
  • public Object[] toArray()

    : 把集合中的元素,存儲到數組中。

代碼示例如下:

import java.util.ArrayList;
import java.util.Collection;

public class Demo1Collection {
    public static void main(String[] args) {
		// 建立集合對象 
    	// 使用多态形式
    	Collection<String> coll = new ArrayList<String>();
    	// 使用方法
    	// 添加功能  boolean  add(String s)
    	coll.add("小李廣");
    	coll.add("掃地僧");
    	coll.add("石破天");
    	System.out.println(coll);

    	// boolean contains(E e) 判斷o是否在集合中存在
    	System.out.println("判斷  掃地僧 是否在集合中"+coll.contains("掃地僧"));

    	//boolean remove(E e) 删除在集合中的o元素
    	System.out.println("删除石破天:"+coll.remove("石破天"));
    	System.out.println("操作之後集合中元素:"+coll);
    	
    	// size() 集合中有幾個元素
		System.out.println("集合中有"+coll.size()+"個元素");

		// Object[] toArray()轉換成一個Object數組
    	Object[] objects = coll.toArray();
    	// 周遊數組
    	for (int i = 0; i < objects.length; i++) {
			System.out.println(objects[i]);
		}

		// void  clear() 清空集合
		coll.clear();
		System.out.println("集合中内容為:"+coll);
		// boolean  isEmpty()  判斷是否為空
		System.out.println(coll.isEmpty());  	
	}
}
           
[小李廣, 掃地僧, 石破天]
判斷  掃地僧 是否在集合中true
删除石破天:true
操作之後集合中元素:[小李廣, 掃地僧]
集合中有2個元素
小李廣
掃地僧
集合中内容為:[]
true
           

2.2.1 List集合

  1. List集合中的元素允許重複,各元素的順序就是元素插入的順序。
  2. List集合包括List接口以及List接口的所有實作類。

類似數組,可通過使用索引來通路集合中的元素。

2.2.1.1 List接口

List接口繼承Collection接口,是以包含Collection中的所有方法。此外,List接口還定義了兩個非常重要的方法。

  1. get(int index):獲得指定索引位置的元素
  2. set(int index,Object obj):将集合中指定索引位置的對象修改為指定的對象

2.2.1.2 List接口的實作類

List接口的實作類有ArrayList和LinkedList。

  1. ArrayList類實作了可變的數組,允許儲存所有元素,包括null,并可以根據索引位置對集合進行快速的随機通路;缺點是向指定的索引位置插入對象或删除對象的速度較慢。
  2. LinkedList類采用連結清單結構儲存對象。這種結構的優點是向集合中插入和删除對象時效率較高,缺點是對于随機通路集合中的對象時效率較低。

2.2.1.3 List集合案例

使用List集合時通常聲明為List類型,可通過不同的實作類來執行個體化集合。

格式:

List<E> list1 = new ArrayList<>();
List<E> list2 = new LinkedList<>();
// E可以是合法的Java資料類型。例如,如果集合中的元素為字元串類型,那麼E可以修改為String。
           
import java.util.ArrayList;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        // 建立集合對象
        List<String> list = new ArrayList<>();
        // 向集合添加元素
        list.add("a");
        list.add("b");
        list.add("c");
        // 獲得0-2之間的随機數
        int i = (int)(Math.random()*list.size());
        System.out.println("随機擷取數組中的元素:" + list.get(i));
        // 将指定索引位置的元素從集合中移除
        list.remove(2);
        // 循環周遊集合剩下的元素
        for(int j=0;j<list.size();j++){
            System.out.println(list.get(j));
        }

    }
}
           
随機擷取數組中的元素:c
a
b
           

2.2.2 Set集合

  1. Set集合中的對象不按特定的方式排序,隻是簡單地把對象加入集合中,但Set集合不能包含重複對象。
  2. Set集合由Set接口和Set接口的實作類組成。

2.2.2.1 Set接口

Set接口繼承了Collection接口,是以包含Collection接口的所有方法。

2.2.2.2 Set接口的實作類

Set接口常用的實作類有HashSet類與TreeSet類。

  1. HashSet類實作Set接口,由哈希表(實際上是一個HashMap執行個體)支援。它不保證Set的疊代順序,特别是它不保證該順序恒久不變。此類允許使用null元素。
  2. TreeSet類不僅實作了Set接口,還實作了java.util.SortedSet接口,是以,TreeSet類實作的Set集合在周遊集合時可以按照自然順序遞增排序,也可以按照指定比較器遞增排序,即可以通過比較器對用TreeSet類實作的Set集合中的對象進行排序。TreeSet類新增的方法如下表所示:

TreeSet類新增方法:

方法 功能描述
first() 傳回此Set中目前第一個元素
last() 傳回此Set中目前最後一個元素
comparator() 傳回對此Set中的元素進行排序的比較器,如果此Set使用自然順序,則傳回null
headSet(E toElement) 傳回一個新的Set集合,新集合包含toElement(不包含)之前的所有對象
subSet(E fromElement, E toElement) 傳回一個新的Set集合,新集合包含fromElement(包含)與toElement(不包含)之間的所有對象
tailSet(E fromElement) 傳回一個新Set集合,新集合包含fromElement(包含)之後的所有對象

2.2.2.3 TreeSet接口案例

建立類UpdateStu,實作Comparable接口,重寫該接口中的compareTo()方法。

import java.util.Iterator;
import java.util.TreeSet;

public class UpdateStu implements Comparable<Object> {//建立類實作Comparable接口
	String name;
	long id;

	public UpdateStu(String name,long id){//構造方法
		this.id = id;
		this.name = name;
	}

	public int compareTo(Object o) {
		UpdateStu upstu = (UpdateStu)o;
		int result = id>upstu.id?1:(id==upstu.id?0:-1);//參照代碼說明
		return result;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public long getId() {
		return id;
	}

	public void setId(long id){
		this.id = id;
	}
	
	public static void main(String[] args) {
		UpdateStu stu1 = new UpdateStu("李同學", 01011);
		UpdateStu stu2 = new UpdateStu("陳同學", 01021);
		UpdateStu stu3 = new UpdateStu("王同學", 01051);
		UpdateStu stu4 = new UpdateStu("馬同學", 01012);
		TreeSet<UpdateStu> tree = new TreeSet<>();
		tree.add(stu1);// 向集合添加對象	
		tree.add(stu2);
		tree.add(stu3);
		tree.add(stu4);	
		//Set集合中的所有對象的疊代器
		Iterator<UpdateStu> it = tree.iterator();
		System.out.println("Set集合中的所有元素:");
		//周遊集合
		while(it.hasNext()){
			UpdateStu stu = (UpdateStu)it.next();
			System.out.println(stu.getId() + " " + stu.getName());
		}
		//截取排在stu2對象之前的對象
		it = tree.headSet(stu2).iterator();
		System.out.println("截取前面部分的集合:");
		//周遊集合
		while(it.hasNext()){
			UpdateStu stu = (UpdateStu)it.next();
			System.out.println(stu.getId() + " " + stu.getName());			
		}
		//截取排在stu2與stu3之間的對象
		it = tree.subSet(stu2,stu3).iterator();
		System.out.println("截取中間部分的集合:");
		while(it.hasNext()) {
			UpdateStu stu = (UpdateStu)it.next();
			System.out.println(stu.getId() + " " + stu.getName());		
		}	
	}
}
           
Set集合中的所有元素:
521 李同學
522 馬同學
529 陳同學
553 王同學
截取前面部分的集合:
521 李同學
522 馬同學
截取中間部分的集合:
529 陳同學
           
存入TreeSet類實作的Set集合必須實作Comparable接口,該接口中的compareTo(Object o)方法比較此對象與指定對象。
           

3 Map集合

3.1 概述

  1. Map集合沒有繼承Collection接口,提供的是key到value的映射;
  2. Map中不能包含相同的key,每個key隻能映射一個value;
  3. Map集合包括Map接口以及Map接口的所有實作類;
  4. Map中的key決定了存儲對象在映射中的存儲位置,但不是由key本身決定的,而是通過一種“散列技術”進行處理,産生一個散列碼的整數值。散列碼通常用作一個偏移量,該偏移量對應配置設定給映射的記憶體區域的起始位置,進而确定存儲對象在映射中的存儲位置。

3.2 Map接口

  1. Map接口儲存一組成對的鍵-值對象,提供key(鍵)到value(值)的映射
  2. Map中的key不要求有序,不允許重複。value同樣不要求有序,但可以重複。

Map接口的常用方法:

方法 功能描述
public V put(K key, V value) 向集合中添加指定的key與value的映射關系
public boolean containsKey(Object key) 如果此映射包含指定key的映射關系,則傳回true
public boolean containsValue(Object value) 如果此映射将一個或多個key映射到指定值,則傳回true
public V get(Object key) 如果存在指定的key對象,則傳回該對象對應的值,否則傳回null
public Set< K > keySet() 傳回該集合中的所有key對象形成的Set集合
public Collection< V > values() 傳回該集合中所有值對象形成的Collection集合
public V remove(Object key) 從集合中删除指定鍵的映射(如果存在)
public boolean isEmpty() 如果集合為空,則傳回 true
public void clear() 清空集合所有映射
public int size() 傳回集合中鍵值映射的數量

代碼示例:

package 冒泡排序;

import java.util.*;

public class UpdateStu {
    public static void main(String[] args) {
        // 建立Map執行個體
        Map<String,String> map = new HashMap<>();
        // 向map中添加元素
        map.put("01","李同學");
        map.put("02","魏同學");
        // 建構Map集合中所有key對象的集合
        Set<String> set = map.keySet();
        // 建立集合疊代器
        Iterator<String> it = set.iterator();
        System.out.println("key集合中的元素:");
        // 周遊集合
        while(it.hasNext()) {
            System.out.println(it.next());
        }
        // 建構Map集合中所有values值的集合
        Collection<String> coll = map.values();
        it = coll.iterator();
        System.out.println("Values集合中的元素:");
        // 周遊集合
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
           
key集合中的元素:
01
02
Values集合中的元素:
李同學
魏同學
           
Map集合中允許值對象是null,而且沒有個數限制。例如,可通過map.put(“05”,null)向集合中添加對象。

3.3 Map接口的實作類

  1. Map接口的實作類有HashMap和TreeMap;
  2. 使用較多的是HashMap,因為由HashMap類實作的Map集合添加和删除映射關系效率更高。
  3. HashMap是基于哈希表的Map接口的實作,HashMap通過哈希碼對其内部的映射關系進行快速查找;而TreeMap中的映射關系存在一定的順序,如果希望Map集合中的對象也存在一定的順序,就使用TreeMap類。

3.3.1 HashMap類

  1. Hash類是基于哈希表的Map接口的實作;
  2. 此實作提供所有可選的映射操作,并允許使用null值和null鍵,但必須保證鍵的唯一性;
  3. HashMap通過哈希表對其内部的映射關系進行快速查找,此類不保證映射的順序,特别是不保證順序恒久不變;

3.3.2 TreeMap類

  1. TreeMap類不僅實作了Map接口,還實作了java.util.SortedMap接口,是以集合中的映射關系具有一定的順序;
  2. 但是,在添加、删除和定位映射關系時,TreeMap類比HashMap類性能稍差;
  3. 由于TreeMap類實作的Map集合中的映射關系是根據鍵對象按照一定順序排列的,是以不允許鍵對象是null。
可以通過HashMap類建立Map集合,當需要順序輸出時,再建立一個完成相同映射關系的TreeMap類執行個體。

代碼示例:

import java.util.*;

class Emp {
    private String e_id;
    private String e_name;
    public Emp(String e_id,String e_name) {
        this.e_id = e_id;
        this.e_name = e_name;
    }

    public String getE_id() {
        return e_id;
    }

    public void setE_id(String e_id) {
        this.e_id = e_id;
    }

    public String getE_name() {
        return e_name;
    }

    public void setE_name(String e_name) {
        this.e_name = e_name;
    }
}

public class MapTest {
    public static void main(String[] args) {
        // 由HashMap實作的Map對象
        Map<String,String> map = new HashMap<>();

        // 建立Emp對象
        Emp emp1 = new Emp("351","張三");
        Emp emp2 = new Emp("512","李四");
        Emp emp3 = new Emp("853","王五");
        Emp emp4 = new Emp("125","趙柳");
        Emp emp5 = new Emp("341","黃芪");

        // 将對象添加到集合中
        map.put(emp4.getE_id(), emp4.getE_name());
        map.put(emp5.getE_id(), emp5.getE_name());
        map.put(emp1.getE_id(), emp1.getE_name());
        map.put(emp2.getE_id(), emp2.getE_name());
        map.put(emp3.getE_id(), emp3.getE_name());

        // 擷取Map集合中的key對象集合
        Set<String> set = map.keySet();
        Iterator<String> it = set.iterator();
        System.out.println("HashMap類實作的Map集合,無序:");
        while(it.hasNext()) {
            String str = it.next();
            String name = map.get(str);
            System.out.println(str + " " + name);
        }
        // 建立TreeMap集合對象
        Map<String,String> treemap = new TreeMap<>();
        // 向集合中添加對象
        treemap.putAll(map);
        Iterator<String> iter = treemap.keySet().iterator();
        System.out.println("TreeMap類實作的Map集合,鍵對象升序:");
        while(iter.hasNext()) {
            String str = iter.next();
            String name = map.get(str);
            System.out.println(str + " " + name);
        }
    }
}
           
HashMap類實作的Map集合,無序:
341 黃芪
125 趙柳
512 李四
853 王五
351 張三
TreeMap類實作的Map集合,鍵對象升序:
125 趙柳
341 黃芪
351 張三
512 李四
853 王五