美文网首页
***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接口(存放数据用于查找)

    Collection每一次都只会保存一个对象,而Map主要是保存一对对象 Map接口的主要操作方法 Map接口的常...

  • Timeline

    PlayableTrack PlayableBehaviour用于存放逻辑 PlayableAsset用于存放数据

  • 《每天5分钟玩转 Kubernetes》10 ConfigMap

    secret 用于存放敏感数据,configmap 用于存放普通数据,用法与 secret 类似。 创建 启动: ...

  • Volley源码解析之数据结构

    使用2个BlockingQueue, 用于存放请求队列, 和网络队列 Cache 是一个接口, 网络数据缓存到Di...

  • 1.项目结构

    api:用于存放 请求数据的JS文件 assets:用于存放公共资源参数 comm:用于存放一些常用的组件 com...

  • 集合框架

    集合框架的概念 集合:存放数据的容器 集合框架:java中,用于表示集合,以及操作集合的类和接口的统称 数组与集合...

  • 数据结构-集合(Set)

    集合的特点 不存放重复的元素 常用于去重 存放新增 IP,统计新增 IP 量 存放词汇,统计词汇量... 接口设计...

  • iOS开发中创建远程私有库步骤

    需要一个私有仓库和私有仓库索引 私有仓库用于存放所有组件私有仓库索引用于查找存放的所有组件如图: 创建成功之后我们...

  • 数据结构(七)查找

    7.1 查找的基本概念 查找:在数据集合中寻找满足某种条件的数据元素的过程 查找表:用于查找的顺序集合 查找表不是...

  • Python学习打call第六十七天:将获取的指标封装成接口提供

    1.将阿里云的监控指标推送到企业微信 (1)首先需要在项目的根路径下,创建utils包,用于存放项目的其他数据接口...

网友评论

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

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