Map接口及其实现类(集合)

Map接口的概念特点

Map 接口
元素是由一个一个键值对组成,键不允许重复,值允许重复,<K,V> 键值对

         --HashMap
        底层数据结构是哈希表,保证了元素的唯一(指的是键的唯一性),元素是无序
        当键是自定义类型的时候,要想保证唯一性,就必须重写hashCode()方法和equals()方法
        --LinkedHashMap
            底层数据结构是哈希表和链表
            哈希表保证的是元素的唯一性
            链表保证的是元素有序(指的是存储和取出的顺序一致)

        --TreeMap
        底层数据结构是红黑树
        排序针对于键来说的
        自然排序 元素的数据类型的类实现Comparable<T>接口,重写compareTo()方法
               比较器排序
        自定义一个类实现Comparator<T>接口,重写compare()方法
        匿名内部类的形式进行构造方法传参,重写compare()方法

Map接口与Collection接口有什么区别?

   1、Map接口与Collection接口是平级关机,不存在继承关系,都是属于util包下面的
   2、Map集合中的元素都是成对出现的,Map集合中的键是唯一的,值是可以重复的 又称之为:夫妻对
   3、Collection集合中的元素都是单独出现的,Collection接口下面有个子接口Set,它的元素也是唯一的
       List中的元素也是单独出现,可以重复,像这样单独出现的元素,称之为:光棍

Map接口中的方法:

     1、添加功能:
        V put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。
        举例:map.put(1001,"周杰伦");
    2、删除功能:
        void clear() 从该Map中删除所有的映射(可选操作)。
        V remove(Object key) 如果存在(从可选的操作),从该Map中删除一个键的映射。
    3、判断功能:
        boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
        boolean containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。
        boolean isEmpty() 如果此地图不包含键值映射,则返回 true 。
    4、获取功能:
        V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
        Set<K> keySet() 返回此Map中包含的键的Set视图。
        Collection<V> values() 返回此Map中包含的值的Collection视图
        Set<Map.Entry<K,V>> entrySet() 获取Map中所有元素,元素的类组成是由一个键和一个值组成
    5、长度功能:
        int size() 返回此Map中键值映射的数量。

public class MapDemo {
    public static void main(String[] args) {
        //创建Map集合对象
        //由于Map是一个接口,所以接口不能直接实例化,要使用一个具体的子类进行实例化
        //这里借助HashMap
        Map<String,String> map = new HashMap<>();
        //添加元素
        //V put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。
        //这里的返回值是将来再次插入同一个键的时候,被覆盖的那个值
        map.put("黄晓明","杨颖");
        map.put("邓超","孙俪");
        map.put("小虎","冯提莫");
        map.put("小虎","IU");
        //删除功能
        //void clear() 从该Map中删除所有的映射(可选操作)。
//        map.clear();
//        V remove(Object key) 如果存在(从可选的操作),从该Map中删除一个键的映射。
        //返回对应删除的值
//        System.out.println(map.remove("小虎"));
        System.out.println("==========================================");
        //boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
        System.out.println(map.containsKey("小虎"));
        //boolean containsValue(Object value) 
        //如果此地图将一个或多个键映射到指定的值,则返回 true 。
        System.out.println(map.containsValue("IU"));
        System.out.println(map.isEmpty());
        System.out.println(map);
    }
}

因为增强for循环只能遍历Collection集合和数组,所以我们如果想要用增强for循环去遍历Map集合,我们就需要用方法去把Map集合转变成Collection集合或者其子类,代码实现如下

        //Set<K> keySet() 返回此Map中包含的键的Set视图。
        Set<String> set = map.keySet();
        for (String s : set) {
//            System.out.println(s);
            String value = map.get(s);
            System.out.println(s + ":" + value);
        }
        //Collection<V> values() 返回此Map中包含的值的Collection视图
        Collection<String> values = map.values();
        for (String s : values) {
            System.out.println(s);
        }

Map集合遍历两种方式

集合遍历的方式一:根据键找值

1、通过调用keySet()方法获取Map集合中所有的key

2、结合get(key)这个方法,可以获取到每一个key对应的value

3、输出

        //通过调用keySet()方法获取Map集合中所有的key
        Set<String> keySet = map.keySet();
        //遍历keySet获取到每一个key
        for (String s : keySet) {
            String value = map.get(s);
            System.out.println(s + ":" + value);
        }

Map集合遍历的第二种方式:
    一次先把所有的键值对获取到,然后在依次获取每一个键值对的key和value

        //遍历:一次先把所有的键值对获取到
        //Set<Map.Entry<K,V>> entrySet() 获取Map中所有元素,元素的类组成是由一个键和一个值组成
        Set<Map.Entry<String, String>> set = map.entrySet();
        //遍历集合获取每一个键值对
        for (Map.Entry<String, String> keyValue : set) {
            String key = keyValue.getKey();
            String value = keyValue.getValue();
            System.out.println(key + ":" + value);
        }

将来开发的时候用谁呢?

1、元素的组成是单个还是成对,如果是单个使用Collection下面的集合,如果是成对出现的,使用Map下面的集合
    2、元素允许重复吗?
        允许:List
        不允许:Set
    3、元素需要排序吗?
        需要:TreeSet或者TreeMap
        不需要:ArrayList等
    4、将来查找的功能多吗?
        多,用底层是数组的集合
    5、将来增删操作多吗?
        多,用底层是链表的集合

如果你什么都不知道,用ArrayList。推荐具体情况具体选择。

注意:
    增强for循环只能作用于数组和Collection集合,不适用于Map集合

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值