集合(三):Map;HashMap;LinkedHashMap;TreeMap;集合嵌套

集合(三)

Map

	將鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。所有Map集合的數據結構,只跟鍵有關,跟值沒關係,鍵相同,值覆蓋 

一、HashMap

1、概述及特點

	基於哈希表的 Map 接口的實現。允許使用 null 值和 null 鍵。鍵值對無序(存取順序)。線程不安全,效率高。

2、HashMap常用方法

Map集合的功能概述
	a:添加功能 
		V put(K key,V value):添加元素。
			如果鍵是第一次存儲,就直接存儲元素,返回null
			如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值
	b:刪除功能
		void clear():移除所有的鍵值對元素
		V remove(Object key):根據鍵刪除鍵值對元素,並把值返回
	c:判斷功能
		boolean containsKey(Object key):判斷集合是否包含指定的鍵
		boolean containsValue(Object value):判斷集合是否包含指定的值
		boolean isEmpty():判斷集合是否爲空
	d:獲取功能
		Set<Map.Entry<K,V>> entrySet(): 返回一個鍵值對的Set集合
		V get(Object key):根據鍵獲取值
		Set<K> keySet():獲取集合中所有鍵的集合
		Collection<V> values():獲取集合中所有值的集合
		int size():獲取集合中的鍵值對的對數

3、HashMap常用方法測試

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Blog {
    public static void main(String[] args) {
        HashMap<String, Integer> hashMap = new HashMap<>();
        /*-----添加元素-----*/
        Integer oldValue = hashMap.put("aaa", 111);//之前沒存過"aaa"鍵,返回null
        System.out.println(oldValue);  //null
        Integer oldValue1 = hashMap.put("aaa", 222);//鍵相同,值替換,返回被替換掉的值
        System.out.println(oldValue1); //111
        hashMap.put("bbb",222);
        System.out.println(hashMap);//{aaa=222, bbb=222}
        /*-----刪除元素-----*/
        Integer aaa = hashMap.remove("aaa");//根據鍵刪除指定鍵值對
        System.out.println(hashMap);//{bbb=222}
        System.out.println(aaa);//222
        hashMap.clear();//清空集合
        System.out.println(hashMap);//{}
        /*-----判斷功能-----*/
        hashMap.put("ccc",333);
        boolean c = hashMap.containsKey("ccc");//判斷集合是否包含指定鍵
        System.out.println(c);//true
        boolean c1 = hashMap.containsValue(333);//判斷集合是否包含指定鍵值
        System.out.println(c1);//true
        boolean empty = hashMap.isEmpty();//判斷集合是否爲空
        System.out.println(empty);//false
        /*-----獲取功能-----*/
        Set<Map.Entry<String, Integer>> set = hashMap.entrySet();//獲取鍵值對的set集合
        hashMap.get("ccc");//根據鍵獲取值 //333
        Set<String> keySet = hashMap.keySet();//獲取所有鍵的set集合
        Collection<Integer> values = hashMap.values();//獲取所有值的集合
        hashMap.size();//獲取集合的長度
    }
}

4、Map集合的遍歷

A:方式一:先獲取鍵,再通過鍵找值

public static void traversingWayOne(HashMap<String, Integer> hashMap) {
        Set<String> keySet = hashMap.keySet();
        //遍歷keySet集合,找值
        for (String s : keySet) {
            System.out.println(s);//鍵
            Integer value = hashMap.get(s);
            System.out.println(value);//值
        }
    }

B:方式二:先獲取鍵值對,再獲取鍵和值

public static void traversingWayTwo(HashMap<String, Integer> hashMap) {
        Set<Map.Entry<String, Integer>> set = hashMap.entrySet();
        //遍歷鍵值對集合,找鍵和值
        for (Map.Entry<String, Integer> entry : set) {
            String key = entry.getKey();
            System.out.println(key);
            Integer value = entry.getValue();
            System.out.println(value);
        }
    }

5、HaShMap保證鍵唯一性

//重寫hashCode方法 和 equals 方法
import java.util.HashMap;
import java.util.Objects;

public class Blog2 {
    public static void main(String[] args) {
        //HashMap 之所以能夠保證元素的唯一性,是靠元素重寫 equals()和hashCode()方法來保證的,如果元素不重寫該方法,則不能保證元素的唯一性
        //合理重寫hashCode 方法,可以減少調用equals()的次數,也稱之爲減少碰撞
        HashMap<Student,String> hashMap = new HashMap<>();
        hashMap.put(new Student("張三",23),"1");
        hashMap.put(new Student("李四",27),"1");
        hashMap.put(new Student("王五",26),"1");
        hashMap.put(new Student("張三",23),"1");
        hashMap.put(new Student("李四",27),"1");
        hashMap.put(new Student("王五",26),"1");
        hashMap.put(new Student("趙六",25),"1");
        hashMap.put(new Student("張三",24),"1");
        hashMap.put(new Student("曾七",23),"1");
        System.out.println(hashMap);
    }
}
class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
運行結果:
{Student{name='張三', age=23}=1, Student{name='李四', age=27}=1, Student{name='王五', age=26}=1, Student{name='趙六', age=25}=1, Student{name='張三', age=24}=1, Student{name='曾七', age=23}=1}

6、HashMap和Hashtable關係

	HashMap:可以存null值null鍵,線程不安全,效率高
	Hashtable:不能存null值null鍵,線程安全,效率低
	其餘大致相同。

二、LinkedHashMap

1、概述及特點

	Map 接口的哈希表和鏈表實現,具有可預知的迭代順序(元素有序),並且唯一,可以存儲null鍵null值。元素的有序性由鏈表數據結構保證,唯一性由哈希表數據結構保證,Map集合的數據結構只和鍵有關。

2、演示

import java.util.LinkedHashMap;

public class Blog3 {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("aaa",111);
        linkedHashMap.put("bbb",222);
        linkedHashMap.put(null,null);
        System.out.println(linkedHashMap);
    }
}
運行結果:
{aaa=111, bbb=222, null=null}

Process finished with exit code 0

三、TreeMap

1、概述及特點

	鍵的數據結構是二叉樹,可保證鍵的排序和唯一性,序分爲自然排序和比較器排序,鍵不允許插入null,線程不安全,效率高

2、演示

import java.util.Comparator;
import java.util.TreeMap;

public class Blog4 {
    public static void main(String[] args) {
        //傳入比較器方式:1、可以自己創建一個Comparator<T>接口的子類,並實現 compare方法,傳入該接口的子類對象
        //              2、使用匿名內部類,傳入比較器,並實現compare方法
        TreeMap<Student,String> treeMap = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int num=o1.getAge()-o2.getAge();
                int num1=num==0?o1.getName().compareTo(o2.getName()):num;
                return num1;
            }
        });
        treeMap.put(new Student("張三",23),"a");
        treeMap.put(new Student("李四",27),"a");
        treeMap.put(new Student("王五",26),"a");
        treeMap.put(new Student("張三",23),"a");
        treeMap.put(new Student("李四",27),"a");
        treeMap.put(new Student("王五",26),"a");
        treeMap.put(new Student("趙六",25),"a");
        treeMap.put(new Student("張三",24),"a");
        treeMap.put(new Student("曾七",23),"a");
        //按照年齡從小到大排序
        System.out.println(treeMap);
    }
}
class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
運行結果:
{Student{name='張三', age=23}=a, Student{name='曾七', age=23}=a, Student{name='張三', age=24}=a, Student{name='趙六', age=25}=a, Student{name='王五', age=26}=a, Student{name='李四', age=27}=a}

四、集合嵌套

/*
傳智播客
    jc 基礎班
        張三    20
        李四    22
    jy 就業班
        王五    21
        趙六    23
        
        HashMap嵌套HashMap
        HashMap再嵌套ArrayList
*/
        
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Blog {
    public static void main(String[] args) {
        ArrayList<Student> jcList = new ArrayList<>();
        jcList.add(new Student("張三",20));
        jcList.add(new Student("李四",22));
        ArrayList<Student> jyList = new ArrayList<>();
        jyList.add(new Student("王五",21));
        jyList.add(new Student("趙六",23));
        HashMap<String, ArrayList<Student>> listMap = new HashMap<>();
        listMap.put("jc\t基礎班",jcList);
        listMap.put("jy\t就業班",jyList);
        HashMap<String, HashMap<String, ArrayList<Student>>> maxMap = new HashMap<>();
        maxMap.put("傳智播客",listMap);
        Set<Map.Entry<String, HashMap<String, ArrayList<Student>>>> entries = maxMap.entrySet();
        for (Map.Entry<String, HashMap<String, ArrayList<Student>>> entry : entries) {
            String key = entry.getKey();
            System.out.println(key);
            HashMap<String, ArrayList<Student>> value = entry.getValue();
            Set<Map.Entry<String, ArrayList<Student>>> entries1 = value.entrySet();
            for (Map.Entry<String, ArrayList<Student>> stringArrayListEntry : entries1) {
                String key1 = stringArrayListEntry.getKey();
                System.out.println("\t"+key1);
                ArrayList<Student> value1 = stringArrayListEntry.getValue();
                for (Student student : value1) {
                    String name = student.getName();
                    int age = student.getAge();
                    System.out.println("\t\t"+name+"\t  "+age);
                }
                System.out.println();            }
        }
    }
}
class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
運行結果:
傳智播客
	jc	基礎班
		張三	  20
		李四	  22

	jy	就業班
		王五	  21
		趙六	  23

集合小結

在這裏插入圖片描述

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