美文网首页
***5.Map接口(存放数据用于查找)

***5.Map接口(存放数据用于查找)

作者: 秋笙fine | 来源:发表于2019-02-12 19:25 被阅读0次

    Collection每一次都只会保存一个对象,而Map主要是保存一对对象

    1. Map接口的主要操作方法
    2. Map接口的常用子类。
    3. 使用Iterator接口输出map集合(重要)

    如果说现在要保存一对关联数据(K-V),那么如果直接使用Collection就不能直接满足我们的要求,可以使用Map接口实现此类数据的保存,并且Map接口还提供有根据key查找value的功能。
    在Map接口里面定义有如下的常用方法。

    public interface Map<K,V>{
      public V put(K key,Vvalue);//向集合中保存数据
      public V get(Object key);//根据key查找对应的value数据
      public Set<Map,Entry<K,V>>entrySet();//将Map集合转化为Set集合
      public Set<K> ketSet();//取出全部的key
    }
    

    其中前三个是最重要的操作方法(Map集合最常用)

    Map接口下有两个常用子类:HashMap(线程不安全),Hashtable(线程安全,弃用)

    范例:HashMap:

        public static void main(String[] args) throws Exception {
    
            Map<String,Integer> all = new HashMap<String,Integer>();
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            all.put("A",1);
            all.put("B",2);// 全部信息重复
            all.put("C",3);
            all.put("C",33);
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            System.out.println(all);
    
        }
    

    结果:


    image.png

    特点:

    • 使用HashMap定义的Map集合是无序存放的(顺序无用)
    • 如果出现了重复的key会进行覆盖,使用新的内容替换旧的内容
      在Map接口里面提供有get()方法,这个方法的主要功能是根据key查找所需要的value。

    范例:查询操作:

        public static void main(String[] args) throws Exception {
    
            Map<String,Integer> all = new HashMap<String,Integer>();
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            all.put("A",1);
            all.put("B",2);// 全部信息重复
            all.put("C",3);
            all.put(null,0);
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            System.out.println(all.get("A"));
            System.out.println(all.get("D"));//如果key不存在,返回null
            System.out.println(all.get(null));//如果查找null,返回0
    
        }
    

    结果:


    image.png
    Map存放数据的最终目的是为了查找。但是Collection存放数据的目的是为了输出。

    范例:取得全部的key(意义不大,只是为了证明Hashmap中的key不能重复)

        public static void main(String[] args) throws Exception {
    
            Map<String,Integer> all = new HashMap<String,Integer>();
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            all.put("A",1);
            all.put("B",2);// 全部信息重复
            all.put("C",3);
            all.put(null,0);
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            Set<String> set=all.keySet();//取得所有的key 并将Map集合转为Set集合
            //使用Iterator遍历集合的key
            Iterator<String> iter=set.iterator();
            while(iter.hasNext()){
                String str=iter.next();
                System.out.println(str);
            }
    
        }
    
    image.png

    在Map接口下还有一个hashtable的子类,此类是在JDK1.0的时候提供的,属于最早的Map集合的实现操作,在JDK1.2的时候让其多实现了一个Map接口,从而保存下来继续使用。
    范例:使用Hashtable

        public static void main(String[] args) throws Exception {
    
            Map<String,Integer> all = new Hashtable<String,Integer>();
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            all.put("A",1);
            all.put("B",2);// 全部信息重复
            all.put("C",3);
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            System.out.println(all);
    
        }
    
    image.png

    现在发现Hashtable里面对于key和value的数据都不允许设置为null。

    面试题:请解释HashMap与Hashtable的区别?

    HashMap(90%)
    1.JDK1.2推出
    2.线程不安全
    3.异步操作
    4.允许key/value为null
    
    Hashtable:
    1.JDK1.0推出
    2.线程安全
    3.同步操作,性能消耗大 ,弃用
    4.不允许key/value为null
    

    关于Iterator输出的问题(核心):

    在之前强调过,只要是集合的输出,就要使用Iterator输出。但是在整个Map接口里面,并没有定义任何的可以返回Iterator接口对象的方法,所以下面如果想要使用Iterator输出Map集合,我们首先必须要针对于Map集合与Collection集合保存数据的特点进行分析后才能实现。

    每当用户使用put()方法向Map集合里面保存一对数据的时候都会被自动的封装为Map.Entry接口对象(内部接口对象),那么来观察以下这个内部接口(节点接口)

    public static interface Map.Entry<K,V>
    

    在这个接口里面定义了两个操作:
    取得key:public K getKey();
    取得value:public V getValue();

    image.png

    因此每次Iterator每次遍历出的是Map.Entry对象。

    在Map接口里面定义有一个将Map集合转化为Set集合的方法。
    public Set<Map.Entry<K,V>>entrySet();

    有了这个Set集合,我们就能得到所有的Map.Entry对象,再用Iterator遍历这个Map集合

    Map集合利用Iterator接口输出步骤
    • 利用Map接口的entrySet()方法,将Map集合转化为Set集合,里面的泛型是Map.Entry
    • 利用Set集合中的Iterator()方法将Set集合进行Iterator输出
    • 每一次Iterator循环取出的都是Map.Entry接口对象,利用此对象进行key与value的取出。

    范例:利用Iterator实现Map接口的输出

        public static void main(String[] args) throws Exception {
    
            Map<String,Integer> all = new Hashtable<String,Integer>();
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            all.put("A",1);
            all.put("B",2);// 全部信息重复
            all.put("C",3);
            System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
            //将Map集合转化为Set,目的是为了使用Iterator方法
            Set<Map.Entry<String,Integer>> set=all.entrySet();
            Iterator<Map.Entry<String,Integer>> iter=set.iterator();
            while(iter.hasNext()){
                Map.Entry<String,Integer> me=iter.next();
                System.out.println(me.getKey()+"="+me.getValue());
            }
        }
    
    image.png

    以上就是使用Iterator遍历Map集合的步骤,一定要掌握,熟练掌握。

    关于Map集合中key的说明

    在使用Map接口的时候可以发现,几乎可以使用任意的类型来作为key或value存在,那么就可以使用自定义的类型来作为key,那么这个作为key的自定义的类必须要覆写Object类之中的hasCode与equals方法,因为只有靠这两个方法才能够确定元素是否重复,而在Map中指的是是否能够找到。

    class Book{
      private String title;
      public Book(String title){
      this.title=title;
      }
    //这里要使用IDE生成hasCode与equals,因为将作为key来判断元素是否重复
    }
    
    main方法{
      Map<Book,String> map=new HashMap<Book,String>();
    map.put(new Book("Java Dev"),new String("Java"));
    System.out.println(map.get(new Book("Java Dev")));
    }
    

    最终才会显示出结果Java

    在以后使用Map集合的时候,首选key的类型是String,尽量不要使用自定义的类型作为key。因为String准备好了hashCode和equals。

    总结:

    1.Map集合保存数据的目的是为了查询使用,而Collection是为了输出使用
    2.Map使用Iterator接口输出的步骤以及具体实现代码
    3.HashMap可以保存null,key重复会出现覆盖,Hashtable不可以保存null。

    相关文章

      网友评论

          本文标题:***5.Map接口(存放数据用于查找)

          本文链接:https://www.haomeiwen.com/subject/mawkeqtx.html