Map双列集合

懵懂的女人 提交于 2019-11-27 02:18:00

Map

概括

  • Map是双列集合,双列集合中的每一个元素都是一个键值对。

  • Map<K,V>有两个泛型,K表示键的数据类型,V表示值的数据类型。

Map中的常见方法:

  • (记住)V put(K key, V value):向Map集合中添加键值对元素。在添加时,如果键已经存在,就会使用新的值覆盖掉原来的值。

  • (记住)V get(Object key): 根据键获取对应的值。

  • boolean containsKey(Object key): 判断Map集合中是否包含指定的键。

  • V remove(Object key): 根据键删除整个的键值对, 并返回被删除的值。

tips:

Map是一个接口,如果要用,需要使用实现类,最常用的实现类是HashMap

public class Demo01MapMethod {
    public static void main(String[] args) {
        //创建Map集合保存数据。 key为整数,value为字符串
        Map<Integer, String> map = new HashMap<>();
        //V put(K key, V value):向Map集合中添加键值对元素。
        map.put(100, "刘德华");
        map.put(200, "张学友");
        map.put(300, "郭富城");
        //输出map集合
        System.out.println("map:" + map);//{100=刘德华, 200=张学友, 300=郭富城}
        //V get(Object key): 根据键获取对应的值。
        System.out.println(map.get(100));//刘德华
        System.out.println(map.get(200));//张学友
        System.out.println(map.get(10000));//null 如果调用get方法根据键获取值时,该键不存在,得到null值。
        //boolean containsKey(Object key): 判断Map集合中是否包含指定的键。
        System.out.println("map集合是否包含100这个键:" + map.containsKey(100));
        System.out.println("map集合是否包含10000这个键:" + map.containsKey(10000));
        //V remove(Object key): 根据键删除整个的键值对, 并返回被删除的值。
        //将键为200的键值对元素删除
        String value = map.remove(200);
        System.out.println("map:" + map);//{100=刘德华, 300=郭富城}
        System.out.println("value:" + value);//张学友
        System.out.println("===================================================");

        //创建Map集合,key是字符串,value也是字符串
        Map<String, String> map2 = new HashMap<>();
        //向Map集合中添加元素
        map2.put("it001", "王宝强");
        map2.put("it002", "贾乃亮");
        map2.put("it003", "陈羽凡");
        //添加元素。 调用put方法添加键值对元素时,如果键已经存在,会使用新的值覆盖掉原来的值。
        //map2.put("it003", "大郎");

        //输出map2
        System.out.println("map2:" + map2);

        //put方法返回的是被替换掉的值
        //如果调用put方法时,没有产生覆盖效果,那么得到的返回值是null
        //如果调用put方法,产生了覆盖效果,那么得到的是被覆盖掉元素的值。
        System.out.println(map2.put("it004", "大郎"));//null
        System.out.println(map2.put("it004", "金莲"));//大郎

    }
}

Map遍历

Map集合不能使用迭代器或者增强for循环去遍历。

  • 如果想要遍历Map集合,可以先获取到Map集合中的所有的键,然后把所有的键放入到Set集合。然后遍历Set集合,拿到每一个键, 再根据键获取对应的值。

Map集合中有一个方法叫做keySet,可以获取到所有的键

  • Set keySet():获取到所有的键,然后把所有的键放入到Set集合中返回。

keySet

keySet遍历的步骤:

  1. 调用Map集合的keySet方法,获取到所有的键,并将所有的键放入到一个Set集合中。
  2. 遍历Set集合,拿到里面的每一个键。
  3. 调用Map集合的get方法,根据键获取对应的值。
public class Demo02KeySet {
    public static void main(String[] args) {
        //创建Map集合
        Map<String, String> map = new HashMap<>();
        //添加元素
        map.put("it001", "张三");
        map.put("it002", "李四");
        map.put("it003", "王叔叔");
        //遍历Map集合,依次拿到Map集合中的每一个键和值进行输出。
        //1. 调用Map集合的keySet方法,获取到所有的键,并将所有的键放入到一个Set集合中。
        Set<String> keys = map.keySet();
        //2. 遍历Set集合,拿到里面的每一个键。
        for (String key : keys) {
            //key表示每一个键
            //3. 调用Map集合的get方法,根据键获取对应的值。
            String value = map.get(key);
            System.out.println(key + "-" + value);
        }

    }
}

Map集合中保存的元素都两个部分,一个是键,另一个是值。 在Map集合中,一个键对应一个值。

  • 在Map集合中,使用了Entry对象保存了这种键值对的对应关系。Map集合中有几个键值对,那么就会有几个Entry对象。

  • Map集合的另一种遍历方式就是通过Entry对象的方式进行遍历的, 我们可以先获取到Map集合中的所有的Entry对象,然后根据Entry对象获取到每一个键和值。

entrySet

Map集合中有一个方法叫做entrySet,可以获取到Map集合中的所有的Entry对象

  • Set<Map.Entry<K,V>> entrySet(): 获取到所有的Entry对象并放入到Set集合中返回。

在Entry中有两个方法:

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

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

entrySet的遍历步骤:

  1. 调用Map集合的entrySet方法,获取到所有的Entry对象并放入到Set集合中。
  2. 遍历Set集合,拿到里面的每一个Entry对象。
  3. 调用Entry对象的getKey和getValue获取键和值。

Map集合有两种遍历方式

  1. keySet遍历(推荐)
  2. entrySet遍历
public class Demo03EntrySet {
    public static void main(String[] args) {
        //创建集合
        Map<String, String> map = new HashMap<>();
        //添加元素
        map.put("it001", "张三");
        map.put("it002", "李四");
        map.put("it003", "王叔叔");
        //使用entrySet的方式进行遍历
        //1. 调用Map集合的entrySet方法,获取到所有的Entry对象并放入到Set集合中。
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //2. 遍历Set集合,拿到里面的每一个Entry对象
        for (Map.Entry<String, String> entry : entries) {
            //3. 调用Entry对象的getKey和getValue获取键和值。
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "-" + value);
        }
    }
}

练习

/*
    练习要求: 使用HashMap存储数据,学生对象作为键,家庭住址作为值。
              每个学生都有姓名和年龄两个属性,姓名和年龄完全相同,就看成是同一个对象。

    HashMap判断唯一性的过程和之前学习的HashSet一模一样(因为HashSet内部就是在使用HashMap保存数据)
        1. 先比较两个对象的哈希值
            如果哈希值不同,肯定是不同的对象
            如果哈希值相同,不一定是同一个对象
        2. 如果哈希值相同,还需要使用equals进行比较。
            如果equals的结果是true,表示两个对象相同
            如果equals的结果是false,表示两个对象不同。

    如果要保证HashMap中的key的唯一性(属性相同就看成是同一个对象),那么需要同时重写hashCode和equals

 */
public class Demo04Test {
    public static void main(String[] args) {
        //创建Map集合,保存数据,学生对象作为键,家庭住址作为值。
        Map<Student, String> map = new HashMap<>();
        //添加元素
        map.put(new Student("杨过", 20), "中国");
        map.put(new Student("尹志平", 22), "全真教");
        map.put(new Student("小龙女", 24), "古墓");
        //添加元素
        map.put(new Student("小龙女", 24), "东海龙宫");

        //遍历Map集合
        //先调用Map集合的keySet方法,获取到所有的键
        Set<Student> keys = map.keySet();
        //遍历Set集合,获取到每一个键
        for (Student key : keys) {
            //根据键获取值
            String value = map.get(key);
            System.out.println(key + "-----------" + value);
        }

    }
}

LinkedHashMap

LinkedHashMap也是Map接口下的实现类。

  • LinkedHashMap内部除了有一个哈希表之外,还有一个链表,链表的作用是保证有序。
public class Demo05LinkedHashMap {
    public static void main(String[] args) {
        //创建Map集合
        Map<String, String> map = new LinkedHashMap<>();
        //添加元素
        map.put("it001", "张三");
        map.put("it002", "李四");
        map.put("it003", "王叔叔");
        //输出
        System.out.println(map);
    }
}

练习2

/*
    练习要求: 统计一个字符串中每种字符有多少个
    举例: 字符串aabbbc   a:2 b:3 c:1

    思路:
        1. 键盘录入一个字符串
        2. 定义Map集合,当做计数器,用来统计字符以及出现的次数。 key是字符, value是该字符出现的次数。
        3. 遍历字符串,拿到字符串中的每一个字符
        4. 判断Map集合中的key是否包含遍历到的字符。
            如果包含遍历到的字符,表示之前已经统计过该字符,就获取到该字符出现的次数,把该次数加1,重新放回到Map集合。
            如果不包含遍历到的字符,表示之前没有统计过该字符,那么就将字符放入到Map集合,并将次数设置为1.
        5. 输出结果

 */
public class Demo06Test {
    public static void main(String[] args) {
        //1. 键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请您键盘录入一个字符串");
        String str = sc.nextLine();
        //2. 定义Map集合,当做计数器,用来统计字符以及出现的次数。 key是字符, value是该字符出现的次数。
        Map<Character, Integer> map = new HashMap<>();
        //3. 遍历字符串,拿到字符串中的每一个字符
        for (int i = 0; i < str.length(); i++) {
            //ch表示遍历到的字符(也可以看成字符串中的每一个字符)
            char ch = str.charAt(i);
            //4. 判断Map集合中的key是否包含遍历到的字符。
            if(map.containsKey(ch)) {
                //如果包含遍历到的字符,表示之前已经统计过该字符,就获取到该字符出现的次数,把该次数加1,重新放回到Map集合。
                map.put(ch, map.get(ch) + 1);
            } else {
                //否则就是Map集合中不包含该字符
                //如果不包含遍历到的字符,表示之前没有统计过该字符,那么就将字符放入到Map集合,并将次数设置为1.
                map.put(ch, 1);
            }
        }
        //5. 输出结果
        //通过Map集合调用keySet方法获取所有的key
        Set<Character> keys = map.keySet();
        //遍历Set集合,拿到每一个键
        for (Character key : keys) {
            System.out.println(key + ":" + map.get(key));
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!