1.1 概述

  • Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储。

  • Map中的集合,元素是成对存在的(Key---Value)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

  • Collection中的集合称为单列集合,Map中的集合称为双列集合。

  • 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

1.2 Map常用子类

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

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

1.3 Map接口中的常用方法

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。(如果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集合)。(可用于遍历集合)

1.4 Map集合遍历

  • public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。(可用于遍历集合)

通过获得所有的Key,遍历Key来获得Value

 public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("hdh",1);
        map.put("xj",2);

        Set<String> strings = map.keySet();
        for (String string : strings) {
            System.out.println("Key:"+string+"   "+"Value:+"+map.get(string));
        }
    }

1.5 Entry键值对对象

当Map集合创建时Entry对象就创建了,Entry()的每一项就是Map的一对Key-Value,通过遍历Entry对象,就可以遍历Map

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

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

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("hdh",1);
        map.put("xj",2);
        Set<Map.Entry<String, Integer>> set = map.entrySet();
        for (Map.Entry<String, Integer> entry : set) {
            System.out.println(entry.getKey()+"  "+entry.getValue());
        }
    }

1.6 HashMap存储自定义类型键值

  • 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。

  • 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放。

package com.hdh.map;

import java.util.Objects;

public class Person {
    private String name;
    private Integer age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

   //get,set,tostrong,构造函数省略
}

1.7 LinkedHashMap

HashMap的基础上增加了链表,保证Map的有序

1.8 Map集合练习

使用HashMap完成:获取一个字符串中对应字母出现的次数

解读:通过MapKey唯一,Value不唯一的特点进行遍历。

public class MapTest {
public static void main(String[] args) {
        //友情提示
        System.out.println("请录入一个字符串:");
        String line = new Scanner(System.in).nextLine();
        // 定义 每个字符出现次数的方法
        findChar(line);
    }
    private static void findChar(String line) {
        //1:创建一个集合 存储  字符 以及其出现的次数
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        //2:遍历字符串
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            //判断 该字符 是否在键集中
            if (!map.containsKey(c)) {//说明这个字符没有出现过
                //那就是第一次
                map.put(c, 1);
            } else {
                //先获取之前的次数
                Integer count = map.get(c);
                //count++;
                //再次存入  更新
                map.put(c, ++count);
            }
        }
        System.out.println(map);
    }
}

 

posted on 2019-10-26 19:47  忆夏KhaZix  阅读(112)  评论(0编辑  收藏  举报