一.Map集合特点:       二.HashMa与 LinkedHashMap                    四.HashMap存储自定义类型          五.Hashtable

      集合的遍历         1.使用KeySet方法取出所有key 放入set        2.使用entrySet(); 方法将多个Entry对象放入set集合  

一.Map集合特点:

        1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
        2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
        3.Map集合中的元素,key是不允许重复的,value是可以重复的
        4.Map集合中的元素,key和value是一一对应,与python字典类似

        Interface Map<K,V>接口   已知实现类 : HashMap , Hashtable ,       而 LinkedHashMap  是HashMap 的子类

二.HashMa与 LinkedHashMap

     1.HashMap集合的特点:
           1.HashMap集合底层是哈希表:查询的速度特别的快
                1. JDK1.8之前:数组+单向链表            2. JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
           2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
     2.LinkedHashMap的特点:
               1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
               2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的

     3.定义Map集合   都可以添加null数据

              Map<Integer, String> map = new HashMap<>();       map.put(1,"wyc");    map.put(2,"wyc1");      map.put(3,"wyc2");

              public V put(K key, V value):         添加一对键值对       key不重复,   返回值 是null

                    key重复,会使用新的value替换map中重复的value,   返回被替换的value值

   一. 对键的操作 

          1.boolean containsKey(Object key)    判断集合中是否包含指定的键。           包含返回true,不包含返回false

          2.public V get(Object key)                  获取键对应值。    存在返回 value  不存在返回null

          3.public V remove(Object key):          删除键对应的值,返回被删除元素的值  不存在返回null

          4.   Map<String,Integer> map = new HashMap<>(); 

                    Set<String> set = map.keySet();      keySet(),把Map集合所有的key取出来,存储到一个Set集合中   [1, 2,3]

  二.对键值对的操作

         1.   Set<   Map.Entry<String, Integer>   > set = map.entrySet();   返回map的 多个Entry对象   [1=wyc, 2=wyc1]

         2.Map.Entry<String, Integer>   这是一个Entry 类型,是一个引用型数据类型

三.集合的遍历

  1.使用KeySet方法取出所有key 放入set,

       1.使用 set集合的iterator()方法生成迭代器   再遍历迭代器 使用get方法获取值

Map<Integer, String> map = new HashMap<>();
        map.put(1, "wyc");
        map.put(2, "wyc1");
        map.put(3, "wyc2");
        Set<Integer> set = map.keySet();
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            Integer key = iterator.next();       
            String s = map.get(key);             key 和 value 可以分离
            System.out.println(key+s);
        }

      2.使用增强for循环  不需要生成迭代器,底层完成

Map<Integer, String> map = new HashMap<>();
        map.put(1, "wyc");
        map.put(2, "wyc1");
        map.put(3, "wyc2");
        Set<Integer> set = map.keySet();    
        for (Integer key : set) {            可以省略为 for (Integer key : map.keySet())
            System.out.println(key+map.get(key));
        }

 2.使用entrySet(); 方法将多个Entry对象放入set集合

        1.使用迭代器

Map<Integer, String> map = new HashMap<>();
        map.put(1, "wyc");
        map.put(2, "wyc1");
        map.put(3, "wyc2");
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();
        while (iterator.hasNext()){
            Map.Entry<Integer, String> next = iterator.next();
            System.out.println(next);

      2.使用增强for循环

Map<Integer, String> map = new HashMap<>();
map.put(1, "wyc");
map.put(2, "wyc1");
map.put(3, "wyc2");
Set<Map.Entry<Integer, String>> entries = map.entrySet();
for (Map.Entry<Integer, String> entry : entries) {    可简写为for (Map.Entry<Integer, String> entry : map.entrySet())
    System.out.println(entry);}

四.HashMap存储自定义类型

      1. 键值 key:Person类型           Person类就必须重写hashCode方法和equals方法,以保证key唯一      2.value可以重复

HashMap<String,Person> map = new HashMap<>();  key是String类型,已经重写hashCode方法和equals方法
map.put("北京",new Person("张三",18));  

HashMap<Person,String> map = new HashMap<>();  key是自定义类型,所以在Person类中手动重写hashCode方法和equals方法
map.put(new Person("秦始皇",18),"秦国");

五.Hashtable

      1.java.util.Hashtable<K,V>集合 implements Map<K,V>接口 也实现了Map接口,但是是 HashMap的子类

      2.Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢

     3.Hashtable的子类   Properties集合是一个唯一和IO流相结合的集合

     4.与HashMap的区别是,key   value都不能存储null 数据