Java拾贝第十五天——集合之Map

发布时间 2023-11-03 20:48:59作者: ocraft

image

从上图中可以发现,Map接口与Collection接口是不同的。

Map接口中的每个元素都使用"键值对"的形式存储在集合中。(key→value)

其接口定义如下:

public interface Map<K,V>

K泛型代表的是key,V泛型代表的是value。在使用Map时必须指定两个具体的类型。

Map常见的实现子类:HashMap,TreeMap

HashMap

HashMap是Map的子类,其类定义如下:

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

HashMap与HashSet相同,其内部结构也是散列表。是一种无序的集合。

Map接口的常用方法如下:

方法 类型 描述
void clear() 普通方法 清空集合
V put(K key, V value) 普通方法 添加元素
V get(Object key) 普通方法 根据Key获取value
V remove(Object key) 普通方法 根据Key删除value
boolean containsKey(Object key) 普通方法 判断是否存在某Key
boolean containsValue(Object value) 普通方法 判断是否存在某value
Set<K> keySet() 普通方法 所有Key返回成一个Set集合
Collection<V> values() 普通方法 所有value返回成一个Collection集合

还有一个特殊的方法,

Set<   Map.Entry<K, V>   > entrySet()  普通方法  将一个Map对象转为Set集合
该方法会在文章最后一部分进行详解

V put(K key, V value) 和 V get(Object key)

添加元素 和 获取元素

栗子:

    public static void main(String[] args) {
        Map<String,Integer> map =new HashMap<>();
        map.put("张三",18);
        map.put("张三",19);//重复添加会覆盖上一次的value
        map.put("盖伦",22);
        map.put("灵狐者",26);

        System.out.println(map.get("张三"));
    }

程序运行结果:

19

V remove(Object key)

删除元素
栗子:

    public static void main(String[] args) {
        Map<String,Integer> map =new HashMap<>();
        map.put("张三",18);
        map.put("盖伦",22);
        map.put("易大师",23);

        System.out.println(map.get("盖伦"));

        map.remove("盖伦");
        map.remove("易大师",23);//remove(Object key, Object value) 重载
        System.out.println(map.get("盖伦"));
        System.out.println(map.get("易大师"));
    }

程序运行结果:

22
null
null

boolean containsKey(Object key) 和 boolean containsValue(Object value)

判断key是否存在 和 判断value是否存在
栗子:

    public static void main(String[] args) {
        Map<String,Integer> map =new HashMap<>();
        map.put("张三",18);
        map.put("盖伦",22);
        map.put("易大师",23);

        System.out.println(map.containsValue(22));
        System.out.println(map.containsValue(56));

        System.out.println(map.containsKey("易大师"));
        System.out.println(map.containsKey("沙砾"));
    }

程序运行结果:

true
false
true
false

Set<K> keySet()

把所有Key返回成一个Set集合

栗子:

    public static void main(String[] args) {
        Map<Integer,String> map =new HashMap<>();
        map.put(18,"藕片");
        map.put(29,"竹笋");
        map.put(31,"辣条");
        map.put(27,"锅盖");

        Set<Integer> set = map.keySet();//返回一个Set集合,Set的泛型要与Map中的Key泛型相同
        Iterator<Integer> iterator = set.iterator();//获取到Set直接使用迭代器
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

程序运行结果:

18
27
29
31

Collection<V> values()

把所有value返回成一个Collection集合

栗子:

    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(18, "藕片");
        map.put(29, "竹笋");
        map.put(31, "辣条");
        map.put(27, "锅盖");

        Collection<String> values = map.values();
        Iterator<String> iterator = values.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

程序运行结果:

藕片
锅盖
竹笋
辣条

Set< Map.Entry<K, V> > entrySet()

Set<   Map.Entry<K, V>   > entrySet()

该方法是返回一个Set集合,在Set集合中 他的泛型被指定为Map.Entry

Entry是定义在Map接口中的内部接口,其定义如下:

interface Entry<K,V>

从之前的内容可以知道,在Map集合操作中,所有元素都是通过 "键值对" 的形式保存的。

那么对于Map集合来说,实际上是将 "键值对" 的数据保存在了Map.Entry接口的实例中,

然后再把Map.Entry的实例对象插入到Map集合中,如图:
image

栗子:

    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(18, "藕片");
        map.put(29, "竹笋");
        map.put(31, "辣条");
        map.put(27, "锅盖");

        Set<Map.Entry<Integer, String>> set = map.entrySet();

        Iterator<Map.Entry<Integer, String>> iterator = set.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

程序运行结果:

18=藕片
27=锅盖
29=竹笋
31=辣条

TreeMap

TreeMap是Map的子类。TreeMap主要特点是key有序,如果是自定义的类必须要实现Comparable接口并重写compareTo()方法。(比较器)

栗子:

    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<>();
        map.put("D", "藕片");
        map.put("A", "竹笋");
        map.put("C", "辣条");
        map.put("Z", "锅盖");//无序添加 结果有序

        Set<String> set = map.keySet();
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

程序运行结果:

A
C
D
Z

不关是HashMap还是TreeMap,只要使用自定义的类作为Key,必须重写equals() 和 hashCode()