Map

java.util.Map 特点:

  1. Map集合是一个双列集合,一个元素包含了两个值(key和value);
  2. Map集合中的元素,key和value可以相同,也可以不同;
  3. Map集合中的元素,key是不允许重复的,value是可以重复的;
  4. Map中的元素,key和value是一一对应的;

HashMap

java.util.HashMap implements Map<k,v>接口;
特点:

  1. HashMap集合底层是哈希表,查询速度特别快,多线程的集合,线程不安全;
    JDK1.8以前: 数组+单向链表
    JDK1.8以后: 数组+单向链表/红黑树(链表的长度超过8):提高查询速度;
  2. HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致,并且可以存储null键和null值;

LinkedHashMap

java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
特点:

  1. LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序);
  2. LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是有序的;

HashTable

java.util.LinkedHashtable<K,V>集合 implements Map<K,V>接口
底层也是一个哈希表,是线程安全的集合,是单线程的集合,速度慢,不能存储null值null键;
JDK1.2版本后被HashMap取代;

Map集合常用API

public V put(K key , V value) : 把指定的键与指定的值添加到Map集合中;
存储键值对的时候,k不重复的情况下,返回的v是null;
存储键值对的时候,k重复的情况下,会使用新的value替换重复的k对应的value,然后返回被替换的value;

/**
     * public V put(K key , V value) : 把指定的键与指定的值添加到Map集合中;
     * 返回值 : v
     * 存储键值对的时候,k不重复的情况下,返回的v是null;
     * 存储键值对的时候,k重复的情况下,会使用新的value替换重复的k对应的value,然后返回被替换的value;
     **/
    public static void method01(){
        Map<String, String> map = new HashMap<>();
        String put = map.put("张三", "苹果");
        //结果为 null;k不重复的情况下,返回的v是null
        System.out.println(put);
        String put1 = map.put("张三", "香蕉");
        //结果为 苹果;k重复的情况下,会使用新的value替换重复的k对应的value,然后返回被替换的value;
        System.out.println(put1);
        //{张三=香蕉}
        System.out.println(map);
    }

public V remove(Object key) : 把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值;
如果key存在,v返回被删除的值;
如果Key不存在,v返回null;

/**
     * public V remove(Object key) : 把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值
     * 如果key存在,v返回被删除的值;
     * 如果Key不存在,v返回null;
     * */
    public static void method02(){
        Map<String, String> map = new HashMap<>();
        map.put("张三","苹果");
        map.put("李四","香蕉");
        map.put("王五","榴莲");
        String str = map.remove("张三");
        //打印结果 : 苹果 ;返回被删除元素的值
        System.out.println(str);
        //{李四=香蕉, 王五=榴莲}
        System.out.println(map);
    }

public V get(Object key) : 根据指定的键,在Map中获取对应的值;
如果key存在,v返回被对应的值;
如果Key不存在,v返回null;

/**
     * public V get(Object key) : 根据指定的键,在Map中获取对应的值;
     * 如果key存在,v返回被对应的值;
     * 如果Key不存在,v返回null;
     */
    public static void method03(){
        Map<String, String> map = new HashMap<>();
        map.put("张三","苹果");
        map.put("李四","香蕉");
        map.put("王五","榴莲");
        //key存在
        String str = map.get("张三");
        //打印结果为 : 苹果;
        System.out.println(str);
        //key不存在
        String str1 = map.get("王小二");
        //打印结果 : null;
        System.out.println(str1);
    }

boolean containsKey(Obejct key) : 判断集合中是否包含指定的key;
包含返回true;
不包含返回false;

/**
     * boolean containsKey(Obejct key) : 判断集合中是否包含指定的key;
     * 包含返回true;
     * 不包含返回false;
     * */
    public static void method04(){
        Map<String, String> map = new HashMap<>();
        map.put("张三","苹果");
        map.put("李四","香蕉");
        map.put("王五","榴莲");
        //存在的key
        boolean key = map.containsKey("张三");
        //打印结果 : true
        System.out.println(key);
        //不存在的key
        boolean str = map.containsKey("王小二");
        //打印结果 : false
        System.out.println(str);
    }

Map集合遍历方法:
方法一 :键找值
Set keySet()
思路:

  1. 使用Map集合中的keySet(),把Map集合中所有的key取出来存储到一个set集合中;
  2. 遍历set集合,获取Map中的每一个key;
  3. 通过Map集合的get()方法,获取key对应的value;
/**
     * 方法一 :键找值
     * Set<K> keySet()
     * 思路:
     *  1. 使用Map集合中的keySet(),把Map集合中所有的key取出来存储到一个set集合中;
     *  2. 遍历set集合,获取Map中的每一个key;
     *  3. 通过Map集合的get()方法,获取key对应的value;
     * */
    private static void method05() {
        Map<String, String> map = new HashMap<>();
        map.put("张三","苹果");
        map.put("李四","香蕉");
        map.put("王五","榴莲");
        //1. 使用Map集合中的keySet(),把Map集合中所有的key取出来存储到一个set集合中;
        Set<String> set = map.keySet();
        //2. 遍历set集合,获取Map中的每一个key;
        for (String s : set) {
            //3. 通过Map集合的get()方法,获取key对应的value;
            String str = map.get(s);
            //打印结果 : 香蕉 苹果 榴莲
            System.out.println(str);
        }
    }

方法二 :键值对
Set<Map.Entry<K,V>> entrySet()
使用Entry对象遍历
思路

  1. 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中;
  2. 遍历Set集合,获取每一个Entry对象;
  3. 使用Entry对象中的方法,getKey(),getValue()获取键与值;
/**
     * 方法二 :键值对
     * Set<Map.Entry<K,V>> entrySet()
     * 使用Entry对象遍历
     * 思路
     *
     *  1. 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中;
     *  2. 遍历Set集合,获取每一个Entry对象;
     *  3. 使用Entry对象中的方法,getKey(),getValue()获取键与值;
     * */
    private static void method06() {
        Map<String, String> map = new HashMap<>();
        map.put("张三","苹果");
        map.put("李四","香蕉");
        map.put("王五","榴莲");
        //1. 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中;
        Set<Map.Entry<String, String>> set = map.entrySet();
        //2. 遍历Set集合,获取每一个Entry对象;
        for (Map.Entry<String, String> entry : set) {
            //3. 使用Entry对象中的方法,getKey(),getValue()获取键与值;
            String key = entry.getKey();
            String value = entry.getValue();
            //李四:香蕉 张三:苹果 王五:榴莲
            System.out.println(key+":"+value);
        }
    }

注意 : Map存储自定义对象时一定要重写equals()和hashcode()方法;