Java集合---Map
Map集合属于双列集合。
每一组集合元素，包含一个键(key)，和一个值(value)。
Map集合接口：
    interface Map<K,V>{....}
    K:键的类型
    V:值的类型
键不可以重复，值可以重复
Map集合接口常用的实现类有两个：
    HashMap
    TreeMap
Set集合系列的HashSet就是使用HashMap的键来实现的。
Set集合系列的TreeSet就是使用TreeMap的键来实现的。

创建Map集合的对象HashMap
    Map<String,String> map=new HashMap<>();
向map集合中添加元素：
    V put(K key,V value)    添加元素，参数是键和值
  比如：
    map.put("1001","张三");
    map.put("1002","李四");
从集合总移除元素：
    V remove(Object key);   移除元素，参数是要移除的key键,返回的被移除的Value值
  比如：
    map.remove("1001");
清空集合
    void clear()    移除集合中所有的键值对元素
判断集合中是否包含指定的键
    boolean containKey(Object key)
判断集合中是否包含指定的值
    boolean containValue(Object value)
判断集合是否为空
    boolean isEmpty()
返回集合的长度
    int size();

获取Map集合中的元素
根据键获取值          V get(K key)
获取所有键的集合        Set<K> keySet()
获取所有值的集合        Collection<V> values()
获取所有键值对对象的集合    Set<Map.Entry<K,V>> entrySet()

//尝试一下，遍历map集合
    1、先获取所有键的集合
    2、使用foreach循环，遍历键的集合
    3、循环内根据键获取值

HashMap集合
HashMap集合的底层是哈希表结构的，依赖hashCode方法和equals方法来保证集合键的唯一。
如果键要存的是自定义对象，我们自己创建的类的对象，那么这个类必须要重写hashCode和equals方法

map.put(k,v);


在集合中和之前的元素进行比较，
    hashCode值 如果不一样，直接存进集合。如果一样，就比较equals。
    equals返回结果是否为true，如果有为true的，那么这个元素就覆盖之前的那个元素。
    比如：
    [<k,v>,<k1,v1>,<k2,v2>]
    <k3,v2>
    如果：
        新添加到集合的元素的key的hashCode值和集合中其他元素的Key的hashCode值都不一样，就直接插入集合。
    如果，hashCode值一样。但是equals比较后返回false，那么就以链表的形式挂到hashCode值相同的元素的后面。
    如果，hashCode值一样，equals也一样，就覆盖原来的元素


案例需求：
- 创建一个HashMap集合，键是学生对象(Student)，值是居住地 (String)。存储多个元素，并遍历。
- 要求保证键的唯一性：如果学生对象的成员变量值相同，我们就认为是同一个对象(重写equals和hashCode方法)







