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

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。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 5,948评论 0 13
  • 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算...
    曹振华阅读 7,192评论 1 37
  • 集合类框架的介绍: ![Java 集合类框架](https://upload-images.jianshu.io/...
    LynnGuo阅读 4,055评论 0 1
  • hello!这里是每天推一首好歌的柯基君! 从初中起,柯基君便总喜欢在刷题时听歌,有时甚至认为音乐反而是学习的动力...
    每天推一首好歌的柯基阅读 4,766评论 0 0
  • 要是你去竞选三体的“执剑人”,胜算应该是很大的吧,光是看着你的眼睛,我想三体人应该就感到了强烈的威慑力了吧!
    幽兰达人阅读 2,828评论 0 1