欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Map集合

程序员文章站 2022-07-13 09:20:29
...

一. Map集合

1.1 概述

上一篇博客提到了集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map

单例集合在上一篇博客已经总结,现在对双列集合Map进行总结。

Map集合

 java.util.Map<k,v>集合

 Map集合的特点:

1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)

2.Map集合中的元素,key和value的数据类型可以相同也可以不同

3.Map集合中的元素,key是不允许重复的,value是可以重复的

4.Map集合中的元素,key和value是一一对应

1.2 Map常用子类

HashMap<K,V>:存储数据采用哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

java.util.HashMap<k,v>集合 implements Map<k,v>接口

HashMap集合的特点:

1.HashMap集合底层是哈希表:查询的速度特别快

       JDK1.8之前:数组+单向链表

      JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8) 提高查询速度

2.hashMap集合是一个无序的集合,存储元素和取出顺序有可能不一致

LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

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

LinkedHashMap的特点集合底层是哈希表+链表

1.LinkedHashMap的底层是哈希表+链表(保证了迭代的顺序)

2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的

1.3 Map接口中常用方法

- public V put(K key, V value) 把指定的键与指定的值添加到Map集合中。
- public V remove(Object key) 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
- public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
- boolean containsKey(Object key) 判断集合中是否包含指定的键。
- public Set<K> keySet() 获取Map集合中所有的键,存储到Set集合中。
- public Set<Map.Entry<K,V>> entrySet() 获取到Map集合中所有的键值对对象的集合(Set集合)。
        /*
        public V put(K key, V value)
             返回值:V
                 存储"键值对"的时候,key不重复,返回值V是null
                 存储"键值对"的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值
       */
        Map<String, Integer>  map = new HashMap<>();//创建 map对象

        //添加元素到集合
        map.put("科比", "24");
        map.put("詹姆斯", "23");
        System.out.println(map); //{科比=24,詹姆斯=23}

        /*
        public V remove(Object key)
             返回值:V
                 key存在,V返回被删除的值
                 key不存在,V返回null
       */
        Integer v1 = map.remove("科比");
        System.out.println("v1:"+v1); //24
        /*
        public V get(Object key)
             返回值:V
                  key存在,返回对应的value值
                  key不存在,返回null
       */
        Integer v2 = map.get("詹姆斯");
        System.out.println("v2:"+v2);

提示:

使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;

若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

1.4 Map集合遍历“键找值”方式

第一种:键找值方式:即通过元素中的键,获取键所对应的值

分析步骤:

  1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。使用:keyset()

  2. 遍历键的Set集合,得到每一个键。

  3. 根据键,获取键所对应的值。使用:get(K key)

        //1.使用Map集合中的方法KeySet(),把Map集合所有的key取出来,存储到一个Set集合中
        Set<String> set = map.keySet();
        //2.使用迭代器遍历Set集合
        Iterator<String> it = set.iterator();
        while(it.hasNext()){
            String key = it.next();
            //3.通过Map集合中的方法get(key),通过key找到value
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }
        System.out.println("==========");
        //使用增强for遍历Set集合
        for(String key : set){ //也可以直接使用map.keySet()得到set集合
            //3.通过Map集合中的方法get(key),通过key找到value
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }

1.5 Entry键值对对象

Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

  • public K getKey():获取Entry对象中的键。

  • public V getValue():获取Entry对象中的值。

在Map集合中也提供了获取所有Entry对象的方法:

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

1.6 Map集合遍历键值对

第二种:键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

实现步骤:

     1.使用Map集合中的方法entrySet(),把集合中多个Entry对象取出来,存储到一个Set集合中

     2.遍历Set集合,获取每一个Entry对象

     3.使用Entry对象中的方法getKey()和getValue()获取健与值

        //1.使用Map集合中的方法entrySet(),把集合中多个Entry对象取出来,存储到一个Set集合中
        Set<Map.Entry<String,Integer>> set = map.entrySet();
        //2.遍历Set集合,获取每一个Entry对象
        //使用迭代器遍历Set集合
        Iterator<Map.Entry<String, Integer>> it = set.iterator();
        while(it.hasNext()){
            Map.Entry<String,Integer> entry = it.next();
            //3.使用Entry对象中的方法getKey()和getValue()获取健与值
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }
        for (Map.Entry<String,Integer> entry:set) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }

1.7 HashMap存储自定义类型键值

HashMap存储自定义类型键值

Map集合保证key是唯一的:

当给HashMap中存放自定义对象时,如果自定义对象作为key存在,

这时要保证对象唯一,必须复写对象的hashCode和equals方法。

     /*
        HashMap存储自定义类型键值
        key:Person类型
            Person类就必须重写hashCode和equals方法,可以保证key唯一
        value:String类型
            可以重复
     */
    private static void show(){
        //创建HashMap集合
        HashMap<Person,String> map = new HashMap<>();
        //往集合中添加元素
        map.put(new Person("女王",18),"英国");
        map.put(new Person("秦始皇",18),"秦国");
        map.put(new Person("习大大",60),"中国");
        map.put(new Person("女王",18),"毛里求斯");
        //使用entrySet和增强for遍历Map集合
        Set<Map.Entry<Person,String>> set = map.entrySet();
        for(Map.Entry<Person,String> entry:set){
            Person key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"->"+value);//Person{name='女王', age=18}->毛里求斯 key唯一,value替换
        }

1.8 LinkedHashMap

java.util.LinkedHashMap<K,V> extends HashMap<K,V>

底层原理: 哈希表+链表(记录元素的顺序)

        LinkedHashMap<String,String> linked = new LinkedHashMap<>();
        linked.put("a","a");
        linked.put("c","c");
        linked.put("b","b");
        linked.put("d","d");
        System.out.println(linked); //key不允许重复,有序{a=a, c=c, b=b, d=d}