Java知識(shí)梳理 | 詳析三大集合類(附實(shí)用例程 + 實(shí)踐練習(xí)題)

0.提要

  • List接口的實(shí)現(xiàn)類
    List接口的常用實(shí)現(xiàn)類有ArrayListLinkedList.
    • ArrayList
      a. 實(shí)現(xiàn)了可變的數(shù)組诅迷,允許保存所有元素约素,包括null,并可以根據(jù)索引位置對(duì)集合進(jìn)行快速的隨機(jī)訪問;
      b. 缺點(diǎn)是向指定的索引位置插入對(duì)象或刪除對(duì)象的速度較慢贝攒。
    • LinkedList
      a.采用鏈表結(jié)構(gòu)保存對(duì)象。
      b.優(yōu)點(diǎn)是便于向集合中插入和刪除對(duì)象时甚,需要向集合中插入隘弊、刪除對(duì)象時(shí)哈踱,使用LinkedList類實(shí)現(xiàn)的List集合的效率較高:
      c. 但對(duì)于隨機(jī)訪問集合中的對(duì)象,使用LinkedList類實(shí)現(xiàn)List集合的效率較低梨熙。

  • Set集合
    • Set集合中的對(duì)象不按特定的方式排序开镣,只是簡(jiǎn)單地把對(duì)象加入集合中
    • Set集合中不能包含重復(fù)對(duì)象咽扇;
    • Set集合由Set接口Set接口的實(shí)現(xiàn)類組成邪财。
    • Set接口繼承了Collection接口,因此包含Collection接口的所有方法质欲。

      Set接口常用的實(shí)現(xiàn)類有HashSet類TreeSet類树埠。
    • HashSet
      a. 實(shí)現(xiàn)Set接口,由哈希表(實(shí)際上是一個(gè)HashMap實(shí)例)支持嘶伟。
      b. 它不保證Set的迭代順序怎憋,特別是它不保證該順序恒久不變
      c .此類允許使用null元素九昧。
    • TreeSet
      a. 不僅實(shí)現(xiàn)了Set接口绊袋,還實(shí)現(xiàn)了java.util.SortedSet接口
      b. 因此铸鹰,TreeSet類實(shí)現(xiàn)的Set集合在遍歷集合時(shí)按照自然順序遞增排序癌别;*********%%%%%%%%%%***********
      c. 也可以按照指定比較器遞增排序;
      d. 即可以通過比較器對(duì)用TreeSet類實(shí)現(xiàn)的Set集合中的對(duì)象進(jìn)行排序蹋笼。

  • Map集合
    • Map集合沒有繼承Collection接口展姐,其提供的是key到value的映射
    • Map中不能包含相同的key,每個(gè)key只能映射一個(gè)value姓建;
    • key還決定了存儲(chǔ)對(duì)象在映射中的存儲(chǔ)位置诞仓,
      但不是由key對(duì)象本身決定的,而是通過一種“散列技術(shù)”進(jìn)行處理速兔,產(chǎn)生一個(gè)散列碼的整數(shù)值墅拭;
    • 散列碼通常用作一個(gè)偏移量,該偏移量對(duì)應(yīng)分配給映射的內(nèi)存區(qū)域的起始位置涣狗,從而確定存儲(chǔ)對(duì)象在映射中的存儲(chǔ)位置谍婉;
    • Map集合包括Map接口以及Map接口的所有實(shí)現(xiàn)類。

    • Map接口
      • Map接口提供了將key映射到值的對(duì)象镀钓。
      • 一個(gè)映射不能包含重復(fù)的key穗熬,每個(gè)key最多只能映射到一個(gè)值。
      • Map接口中同樣提供了集合的常用方法丁溅,除此之外還包括如下表所示的常用方法:

        注意:Map集合中允許值對(duì)象是null唤蔗,而且沒有個(gè)數(shù)限制,例如,可通過“map.put("05",null)”語(yǔ)句向集合中添加對(duì)象妓柜。

    • 5.2 Map接口的實(shí)現(xiàn)類
      • Map接口常用的實(shí)現(xiàn)類有HashMapTreeMap箱季;
      • 建議使用HashMap類實(shí)現(xiàn)Map集合;
      • HashMap類實(shí)現(xiàn)的Map集合添加和刪除映射關(guān)系效率更高棍掐;
      • HashMap是基于哈希表Map接口的實(shí)現(xiàn)藏雏;
      • HashMap通過哈希碼對(duì)其內(nèi)部的映射關(guān)系進(jìn)行快速查找
      • TreeMap中的映射關(guān)系存在一定的順序作煌;
      • 如果希望Map集合中的對(duì)象也存在一定的順序掘殴,應(yīng)該使用TreeMap類實(shí)現(xiàn)Map集合。

    • HashMap
      a .是基于哈希表的Map接口的實(shí)現(xiàn)粟誓;
      b. 此實(shí)現(xiàn)提供所有可選的映射操作奏寨,并允許使用null值和null鍵,但必須保證鍵的唯一性努酸。
      c .HashMap通過哈希表對(duì)其內(nèi)部的映射關(guān)系進(jìn)行快速查找服爷。
      d. 此類不保證映射的順序,特別是它不保證該順序恒久不變获诈。

    • TreeMap
      a. 不僅實(shí)現(xiàn)了Map接口仍源,還實(shí)現(xiàn)了java.util.SortedMap接囗,因此舔涎,集合中的映射關(guān)系具有一定的順序笼踩。
      b. 但在添加、刪除和定位映射關(guān)系時(shí)亡嫌,TreeMap類比HashMap類性能稍差嚎于。
      c. 由于TreeMap類實(shí)現(xiàn)的Map集合中的映射關(guān)系是根據(jù)鍵對(duì)象按照一定的順序排列的,因此不允許鍵對(duì)象是null挟冠。

    • **可以通過HashMap類創(chuàng)建Map集合于购,

當(dāng)需要順序輸出時(shí),再創(chuàng)建一個(gè)完成相同映射關(guān)系的TreeMap類實(shí)例知染。如文中綜合實(shí)例:**


1. 集合類概述

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

1.2. 關(guān)于容器控淡,集合類與數(shù)組的不同之處:

  • 數(shù)組的長(zhǎng)度是固定的嫌吠,集合的長(zhǎng)度是可變的;
  • 數(shù)組用來存放基本類型的數(shù)據(jù)掺炭,集合用來存放對(duì)象的引用辫诅。

1.3. 常用的集合有List集合、Set集合和Map集合涧狮;
  List與Set繼承了Collection接口炕矮,各接口還提供了不同的實(shí)現(xiàn)類么夫。

常用集合類的繼承關(guān)系如下:



2. Collection接口

  • Collection接口是層次結(jié)構(gòu)中的根接口;
  • 構(gòu)成Collection的單位稱為元素肤视;
  • Collection接口通常不能直接使用魏割,但該接口提供了添加元素、刪除元素钢颂、管理數(shù)據(jù)的方法。
  • 由于List接口與Set接口都繼承了Collection接口拜银,因此這些方法對(duì)List集合與Set集合是通用的殊鞭。

    常用方法如下表:



下面是一個(gè)綜合實(shí)例,把表中的方法都用一遍:

(Ps:

  • iterator迭代器有點(diǎn)兒像一個(gè)指針一樣的東西尼桶,指向list對(duì)象中的某一個(gè)元素操灿;
  • it.hasNext()中迭代器的hasNext()第一次用的時(shí)候,指向第一個(gè)元素泵督,next()同理)
package com.lzw;

import java.util.*;

public class Muster { // 創(chuàng)建類Muster
    public static void main(String args[]) {
        Collection<String> list = new ArrayList<>(); // 實(shí)例化集合類對(duì)象
        list.add("a"); // 向集合添加數(shù)據(jù)
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        System.out.println("Now add a&b&c&d&e to the list , its size is:"+list.size());
        System.out.println("Print out all element of the list:");
        Iterator<String> it = list.iterator(); // 創(chuàng)建迭代器
        while (it.hasNext()) { // 判斷是否有下一個(gè)元素
            String str = (String) it.next(); // 獲取集合中元素
            System.out.println(str);
        }
        System.out.println("------------------------------------------------");
        list.remove("a");
        list.remove("b");
        list.remove("c");
        System.out.println("Now remove a&b&c of the list , its size is:"+list.size());
        System.out.println("Print out all element of the list:");
        Iterator<String> it1 = list.iterator(); 
        while(it1.hasNext()){
            String str = (String)it1.next();
            System.out.println(str);
        }
        System.out.println("Now is the list Empty?   "+list.isEmpty());
        System.out.println("------------------------------------------------");
        list.remove("d");
        list.remove("e");
        System.out.println("Now remove d&e of the list , its size is:"+list.size());
        System.out.println("Now is the list Empty?   "+list.isEmpty());
    }
}

輸出結(jié)果:

Now add a&b&c&d&e to the list , its size is:5
Print out all element of the list:
a
b
c
d
e
------------------------------------------------
Now remove a&b&c of the list , its size is:2
Print out all element of the list:
d
e
Now is the list Empty?   false
------------------------------------------------
Now remove d&e of the list , its size is:0
Now is the list Empty?   true



3. List集合

  • List集合包括List接口以及接口的所有實(shí)現(xiàn)類趾盐。
  • List集合中的元素允許重復(fù),各元素的順序就是對(duì)象插入的順序小腊。
  • 類似Java數(shù)組救鲤,用戶可通過使用索引(元素在集合中的位置)來訪問集合中的元素。
3.1 List接口

List接口繼承了Collection接口秩冈,因此包含Collection中的所有方法本缠。

此外,List接口還定義了以下兩個(gè)非常重要的方法:
get(int index):獲得指定索引位置的元素;
set(int index入问,Object obj):將集合中指定索引位置的對(duì)象修改為指定的對(duì)象丹锹。

3.2 List接口的實(shí)現(xiàn)類

List接口的常用實(shí)現(xiàn)類有ArrayListLinkedList.

ArrayList
a. 實(shí)現(xiàn)了可變的數(shù)組,允許保存所有元素芬失,包括null,并可以根據(jù)索引位置對(duì)集合進(jìn)行快速的隨機(jī)訪問楣黍;
b. 缺點(diǎn)是向指定的索引位置插入對(duì)象或刪除對(duì)象的速度較慢。

LinkedList
a.采用鏈表結(jié)構(gòu)保存對(duì)象棱烂。
b.優(yōu)點(diǎn)是便于向集合中插入和刪除對(duì)象租漂,需要向集合中插入、刪除對(duì)象時(shí)垢啼,使用LinkedList類實(shí)現(xiàn)的List集合的效率較高:
c. 但對(duì)于隨機(jī)訪問集合中的對(duì)象窜锯,使用LinkedList類實(shí)現(xiàn)List集合的效率較低。

使用List集合時(shí)通常聲明為L(zhǎng)ist類型芭析,可通過不同的實(shí)現(xiàn)類實(shí)例化集合锚扎。
分別通過ArrayListLinkedList類實(shí)例化List集合馁启,代碼如下:

List<E> list = new ArrayList<>();
List<E> list2 = new LinkedList<>();

在上面的代碼中驾孔,E可以是合法的Java數(shù)據(jù)類型芍秆。
例如,如果集合中的元素為字符串類型翠勉,那么E可以修改為String妖啥。



下面是一個(gè)綜合實(shí)例:

import java.util.*;

public class Gather { // 創(chuàng)建類Gather
    public static void main(String[] args) { // 主方法
        List<String> list = new ArrayList<>(); // 創(chuàng)建集合對(duì)象
        list.add("a"); // 向集合添加元素
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        int i = (int) (Math.random() * (list.size())); // 獲得0~4之間的隨機(jī)數(shù)
        System.out.println("隨機(jī)獲取數(shù)組中的元素:" + list.get(i));
        list.remove(2); // 將指定索引位置的元素從集合中移除
        System.out.println("將索引是'2'的元素從數(shù)組移除后,數(shù)組中的元素是:");
        for (int j = 0; j < list.size(); j++) { // 循環(huán)遍歷集合
            System.out.println(list.get(j));
        }
    }
}

輸出結(jié)果:

隨機(jī)獲取數(shù)組中的元素:c
將索引是'2'的元素從數(shù)組移除后对碌,數(shù)組中的元素是:
a
b
d
e



4. Set集合

  • Set集合中的對(duì)象不按特定的方式排序荆虱,只是簡(jiǎn)單地把對(duì)象加入集合中
  • Set集合中不能包含重復(fù)對(duì)象朽们;
  • Set集合由Set接口Set接口的實(shí)現(xiàn)類組成怀读。
  • Set接口繼承了Collection接口,因此包含Collection接口的所有方法骑脱。


Set接口常用的實(shí)現(xiàn)類有HashSet類TreeSet類菜枷。

HashSet
a. 實(shí)現(xiàn)Set接口,由哈希表(實(shí)際上是一個(gè)HashMap實(shí)例)支持叁丧。
b. 它不保證Set的迭代順序啤誊,特別是它不保證該順序恒久不變
c .此類允許使用null元素拥娄。

TreeSet
a. 不僅實(shí)現(xiàn)了Set接口蚊锹,還實(shí)現(xiàn)了java.util.SortedSet接口
b. 因此条舔,TreeSet類實(shí)現(xiàn)的Set集合在遍歷集合時(shí)按照自然順序遞增排序枫耳;*********%%%%%%%%%%***********
c. 也可以按照指定比較器遞增排序;
d. 即可以通過比較器對(duì)用TreeSet類實(shí)現(xiàn)的Set集合中的對(duì)象進(jìn)行排序孟抗。

TreeSet類新增的方法如下表:


幾個(gè)需要注意的地方:

  • compareTo()方法中書寫的內(nèi)容正是TreeSet類實(shí)現(xiàn)的Set集合在遍歷集合時(shí)自然順序遞增排序的依據(jù)迁杨;
  • 使用compareTo()方法的前提是要讓使用的類實(shí)現(xiàn)Comparable接口
  • Set順序遍歷時(shí)凄硼,依據(jù)compareTo()方法中書寫的規(guī)則進(jìn)行自然順序遞增排序铅协,而非add()的順序;
  • headSet()/subSet()/tailSet()三個(gè)方法再截取時(shí)摊沉,所謂的“之前狐史、之后、之間”也是相對(duì)于自然順序遞增排序之的Set結(jié)合说墨,而非add()的順序骏全;
  • 注意上表中包含不包含的運(yùn)用;

(可參考下面實(shí)例加深了解)



下面是一個(gè)綜合實(shí)例:

import java.util.*;
public class UpdateStu implements Comparable<Object> {
    String name;
    long id;
    
    //構(gòu)造方法
    public UpdateStu(String name, long id) {
        this.id = id;
        this.name = name;
    }
    
    //定義排序規(guī)則
    public int compareTo(Object o) {
        UpdateStu upstu = (UpdateStu) o;
        int result = id > upstu.id ? 1 : (id == upstu.id ? 0 : -1);
        return result;
    }
    
    //getter & setter
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public static void main(String[] args) {
        UpdateStu stu1 = new UpdateStu("李同學(xué)", 01011);//吶尼斧!01011是八進(jìn)制=薄!9卓谩Bタ取Oê础!D噶S嗟ⅰ!F谎5帧!9煊颉B粕隆!8硗Α!
        UpdateStu stu2 = new UpdateStu("陳同學(xué)", 01021);
        UpdateStu stu3 = new UpdateStu("王同學(xué)", 01051);
        UpdateStu stu4 = new UpdateStu("馬同學(xué)", 01012);
        
        TreeSet<UpdateStu> tree = new TreeSet<>();
        tree.add(stu1);
        tree.add(stu2);
        tree.add(stu3);
        tree.add(stu4);
        
        Iterator<UpdateStu> it = tree.iterator();
        System.out.println("Set集合中的所有元素:");
        while (it.hasNext()) {
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getId() + " " + stu.getName());
        }
        System.out.println("李馬陳王是自然排序怜浅,其對(duì)應(yīng)的對(duì)象名順序是:");
        System.out.println("stu1");
        System.out.println("stu4");
        System.out.println("stu2");
        System.out.println("stu3");
        System.out.println(" ");
        System.out.println("tree.first().getName():" + tree.first().getName());
        System.out.println("tree.last().getName():" + tree.last().getName());

        
        System.out.println("------------------------------------------------");
        it = tree.headSet(stu3).iterator();
        System.out.println("截取stu3前面部分的集合:");
        while (it.hasNext()) {
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getId() + " " + stu.getName());
        }
        
        System.out.println("------------------------------------------------");
        it = tree.subSet(stu2, stu3).iterator();
        System.out.println("截取stu2&stu3中間部分的集合");
        while (it.hasNext()) {
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getId() + " " + stu.getName());
        }
        
        System.out.println("------------------------------------------------");
        it = tree.tailSet(stu1).iterator();
        System.out.println("截取stu1后面部分的集合");
        while (it.hasNext()) {
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getId() + " " + stu.getName());
        }
    }
}

輸出結(jié)果:

Set集合中的所有元素:
521 李同學(xué)
522 馬同學(xué)
529 陳同學(xué)
553 王同學(xué)
李馬陳王是自然排序铐然,其對(duì)應(yīng)的對(duì)象名順序是:
stu1
stu4
stu2
stu3
 
tree.first().getName():李同學(xué)
tree.last().getName():王同學(xué)
------------------------------------------------
截取stu3前面部分的集合:
521 李同學(xué)
522 馬同學(xué)
529 陳同學(xué)
------------------------------------------------
截取stu2&stu3中間部分的集合
529 陳同學(xué)
------------------------------------------------
截取stu1后面部分的集合
521 李同學(xué)
522 馬同學(xué)
529 陳同學(xué)
553 王同學(xué)

最后強(qiáng)調(diào):

  • 存入TreeSet類實(shí)現(xiàn)的set集合必須實(shí)現(xiàn)Comparable接口,該接口中的compareTo(Object o)方法
    比較此對(duì)象(this/實(shí)現(xiàn)本接口的類的實(shí)例化對(duì)象)指定對(duì)象(傳進(jìn)來的作為參數(shù)的對(duì)象)的順序恶座;
  • 如果該對(duì)象小于搀暑、等于或大于指定對(duì)象,則分別返回負(fù)整數(shù)跨琳、0或正整數(shù)自点。


5. Map集合

  • Map集合沒有繼承Collection接口,其提供的是key到value的映射脉让;
  • Map中不能包含相同的key,每個(gè)key只能映射一個(gè)value桂敛;
  • key還決定了存儲(chǔ)對(duì)象在映射中的存儲(chǔ)位置,但不是由key對(duì)象本身決定的溅潜,而是通過一種“散列技術(shù)”進(jìn)行處理术唬,產(chǎn)生一個(gè)散列碼的整數(shù)值
  • 散列碼通常用作一個(gè)偏移量滚澜,該偏移量對(duì)應(yīng)分配給映射的內(nèi)存區(qū)域的起始位置粗仓,從而確定存儲(chǔ)對(duì)象在映射中的存儲(chǔ)位置
  • Map集合包括Map接口以及Map接口的所有實(shí)現(xiàn)類设捐。


5.1 Map接口
  • Map接口提供了將key映射到值的對(duì)象借浊。
  • 一個(gè)映射不能包含重復(fù)的key,每個(gè)key最多只能映射到一個(gè)值萝招。
  • Map接口中同樣提供了集合的常用方法蚂斤,除此之外還包括如下表所示的常用方法:

    下面是一個(gè)綜合實(shí)例:

import java.util.*;

public class UpdateStu {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>(); // 創(chuàng)建Map實(shí)例
        map.put("01", "李同學(xué)"); // 向集合中添加對(duì)象
        map.put("02", "魏同學(xué)");
        map.put("03", "王同學(xué)");
        map.put("04", "陳同學(xué)");
        map.put("05", "張同學(xué)");
        map.put("06", "趙同學(xué)");
        
        Set<String> set = map.keySet(); // 構(gòu)建Map集合中所有key對(duì)象的集合
        Iterator<String> it = set.iterator(); // 創(chuàng)建集合迭代器
        System.out.println("key集合中的元素(map.keySet() + iterator()):");
        while (it.hasNext()) { // 遍歷集合
            System.out.println(it.next());
        }
        System.out.println("------------------------------------------------");
        
        Collection<String> coll = map.values(); // 構(gòu)建Map集合中所有values值集合
        it = coll.iterator();
        System.out.println("values集合中的元素(map.values() + iterator()):");
        while (it.hasNext()) { // 遍歷集合
            System.out.println(it.next());
        }
        System.out.println("------------------------------------------------");
        
        System.out.println("map.get(\"01\")" + map.get("01"));
        System.out.println("map.get(\"02\")" + map.get("02"));
        System.out.println("map.get(\"03\")" + map.get("03"));
        System.out.println("------------------------------------------------");
        
        System.out.println("map.containsKey(\"01\")" + map.containsKey("01"));
        System.out.println("map.containsKey(\"10\")" + map.containsKey("10"));
        System.out.println("map.containsValue(\"李同學(xué)\")" + map.containsValue("李同學(xué)"));
        System.out.println("map.containsValue(\"許同學(xué)\")" + map.containsValue("許同學(xué)"));
    }
}

輸出結(jié)果:

key集合中的元素(map.keySet() + iterator()):
01
02
03
04
05
06
------------------------------------------------
values集合中的元素(map.values() + iterator()):
李同學(xué)
魏同學(xué)
王同學(xué)
陳同學(xué)
張同學(xué)
趙同學(xué)
------------------------------------------------
map.get("01")李同學(xué)
map.get("02")魏同學(xué)
map.get("03")王同學(xué)
------------------------------------------------
map.containsKey("01")true
map.containsKey("10")false
map.containsValue("李同學(xué)")true
map.containsValue("許同學(xué)")false

注意:Map集合中允許值對(duì)象是null,而且沒有個(gè)數(shù)限制即寒,例如橡淆,可通過“map.put("05",null)”語(yǔ)句向集合中添加對(duì)象召噩。


5.2 Map接口的實(shí)現(xiàn)類
  • Map接口常用的實(shí)現(xiàn)類有HashMapTreeMap
  • 建議使用HashMap類實(shí)現(xiàn)Map集合逸爵;
  • HashMap類實(shí)現(xiàn)的Map集合添加和刪除映射關(guān)系效率更高具滴;
  • HashMap是基于哈希表Map接口的實(shí)現(xiàn);
  • HashMap通過哈希碼對(duì)其內(nèi)部的映射關(guān)系進(jìn)行快速查找师倔;

  • TreeMap中的映射關(guān)系存在一定的順序构韵;
  • 如果希望Map集合中的對(duì)象也存在一定的順序,應(yīng)該使用TreeMap類實(shí)現(xiàn)Map集合趋艘。

HashMap
a .是基于哈希表的Map接口的實(shí)現(xiàn)疲恢;
b. 此實(shí)現(xiàn)提供所有可選的映射操作并允許使用null值和null鍵瓷胧,但必須保證鍵的唯一性显拳。
c .HashMap通過哈希表對(duì)其內(nèi)部的映射關(guān)系進(jìn)行快速查找
d. 此類不保證映射的順序搓萧,特別是它不保證該順序恒久不變杂数。

TreeMap
a. 不僅實(shí)現(xiàn)了Map接口,還實(shí)現(xiàn)了java.util.SortedMap接囗瘸洛,因此揍移,集合中的映射關(guān)系具有一定的順序。
b. 但在添加反肋、刪除和定位映射關(guān)系時(shí)那伐,TreeMap類比HashMap類性能稍差
c. 由于TreeMap類實(shí)現(xiàn)的Map集合中的映射關(guān)系是根據(jù)鍵對(duì)象按照一定的順序排列的石蔗,因此不允許鍵對(duì)象是null罕邀。

可以通過HashMap類創(chuàng)建Map集合,
當(dāng)需要順序輸出時(shí)养距,再創(chuàng)建一個(gè)完成相同映射關(guān)系的TreeMap類實(shí)例燃少。如下的綜合實(shí)例:

首先是一個(gè)Emp類文件:

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

測(cè)試用主類:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class MapText { // 創(chuàng)建類MapText
    public static void main(String[] args) { // 主方法
        Map<String, String> map = new HashMap<>(); // 由HashMap實(shí)現(xiàn)的Map對(duì)象
        Emp emp = new Emp("351", "張三"); // 創(chuàng)建Emp對(duì)象
        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()); // 將對(duì)象添加到集合中
        map.put(emp5.getE_id(), emp5.getE_name());
        map.put(emp.getE_id(), emp.getE_name());
        map.put(emp2.getE_id(), emp2.getE_name());
        map.put(emp3.getE_id(), emp3.getE_name());

//      Set<String> set = map.keySet(); // 獲取Map集合中的key對(duì)象集合
        Iterator<String> it = map.keySet().iterator();
        System.out.println("HashMap類實(shí)現(xiàn)的Map集合,無(wú)序:");
        while (it.hasNext()) { // 遍歷Map集合
            String str = (String) it.next();
            String name = (String) map.get(str);
            System.out.println(str + " " + name);
        }
        
        System.out.println( );
        
        TreeMap<String, String> treemap = new TreeMap<>(); // 創(chuàng)建TreeMap集合對(duì)象
        treemap.putAll(map); // 向集合添加對(duì)象
        Iterator<String> iter = treemap.keySet().iterator();
        System.out.println("TreeMap類實(shí)現(xiàn)的Map集合铃在,鍵對(duì)象升序:");
        while (iter.hasNext()) { // 遍歷TreeMap集合對(duì)象
            String str = (String) iter.next(); // 獲取集合中的所有key對(duì)象
            String name = (String) treemap.get(str); // 獲取集合中的所有values值
            System.out.println(str + " " + name);
        }
    }
}

輸出結(jié)果:

HashMap類實(shí)現(xiàn)的Map集合阵具,無(wú)序:
341 黃七
125 趙六
512 李四
853 王一
351 張三

TreeMap類實(shí)現(xiàn)的Map集合,鍵對(duì)象升序:
125 趙六
341 黃七
351 張三
512 李四
853 王一



6. 實(shí)踐練習(xí)題

  1. 將1~100之間的所有正整數(shù)存放在一個(gè)List集合中定铜,并將集合中索引位置是10的對(duì)象從集合中移除阳液。
import java.util.*;
public class Text {
    public static void main(String[] args) {
        List<Integer> list = new LinkedList<>();
        for(int i = 1 ;i<=100;i++){
            list.add(new Integer(i));
            }
        list.remove(list.get(10));
        System.out.println("ok");
    }
}

輸出結(jié)果:

ok
  1. 分別向Set集合以及List集合中添加"A” “a” "c” "C” "a”5個(gè)元素,觀察重復(fù)值"a”能否
    重復(fù)地在List集合以及Set集合中添加揣炕。
import java.util.*;
public class Text {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();  //HashSet是Set的子接口
        set.add("a");
        set.add("c");
        set.add("A");
        set.add("a"); 
        set.add("C");
        
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("c");
        list.add("A");
        list.add("a"); 
        list.add("C");
        
        System.out.println(set);
       System.out.println(list);
    }
}

輸出結(jié)果:

[a, A, c, C]
[a, c, A, a, C]
  1. 創(chuàng)建Map集合帘皿,創(chuàng)建Emp對(duì)象,并將Emp對(duì)象添加到集合中(Emp對(duì)象的id作為Map集合的鍵)畸陡,并將id為“015”的對(duì)象從集合中移除鹰溜。

首先是Emp.java:

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

然后是主類:

import java.util.*;

public class Text {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<>();
        
        Emp emp = new Emp("001", "張三");
        Emp emp2 = new Emp("005", "李四");
        Emp emp3 = new Emp("004", "王五");
        Emp emp4 = new Emp("010", "趙六");
        Emp emp5 = new Emp("015", "魏七");
        
        map.put(emp.getE_id(), emp.getE_name());
        map.put(emp2.getE_id(), emp2.getE_name());
        map.put(emp3.getE_id(), emp3.getE_name());
        map.put(emp4.getE_id(), emp4.getE_name());
        map.put(emp5.getE_id(), emp5.getE_name());
        
        map.remove("015");
        for (String string : map.keySet()) {
            System.out.println(map.get(string));
        }
    }
}

輸出結(jié)果:

張三
王五
李四
趙六





參考資料:《Java從入門到精通》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虽填,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子曹动,更是在濱河造成了極大的恐慌斋日,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓陈,死亡現(xiàn)場(chǎng)離奇詭異恶守,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贡必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門兔港,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仔拟,你說我怎么就攤上這事衫樊。” “怎么了利花?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵橡伞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我晋被,道長(zhǎng),這世上最難降的妖魔是什么刚盈? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任羡洛,我火速辦了婚禮,結(jié)果婚禮上藕漱,老公的妹妹穿的比我還像新娘欲侮。我一直安慰自己,他們只是感情好肋联,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布威蕉。 她就那樣靜靜地躺著,像睡著了一般橄仍。 火紅的嫁衣襯著肌膚如雪韧涨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天侮繁,我揣著相機(jī)與錄音虑粥,去河邊找鬼。 笑死宪哩,一個(gè)胖子當(dāng)著我的面吹牛娩贷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锁孟,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼彬祖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼茁瘦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起储笑,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甜熔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后南蓬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺非,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年赘方,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烧颖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窄陡,死狀恐怖炕淮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跳夭,我是刑警寧澤涂圆,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站币叹,受9級(jí)特大地震影響润歉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颈抚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一踩衩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贩汉,春花似錦驱富、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赐稽,卻和暖如春叫榕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姊舵。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工翠霍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蠢莺。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓寒匙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锄弱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一会宪、集合入門總結(jié) 集合框架: Java中的集合框架大類可分為Collection和Map肖卧;兩者的區(qū)別: 1、Col...
    程序員歐陽(yáng)閱讀 11,558評(píng)論 2 61
  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,939評(píng)論 0 13
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 875評(píng)論 0 1
  • 集合類框架的介紹: ![Java 集合類框架](https://upload-images.jianshu.io/...
    LynnGuo閱讀 754評(píng)論 0 1
  • 萬(wàn)小讓掸鹅,他希望在城市沒醒之前死去塞帐。 萬(wàn)小讓在夏天開始的時(shí)候養(yǎng)了條狗,那條狗是他在收工的時(shí)候巍沙,在工地附近的水溝里發(fā)現(xiàn)...
    麥那多多閱讀 304評(píng)論 4 5