zoukankan      html  css  js  c++  java
  • JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱、头疼。在床上躺了几天,什么事情都干不了。接下来这段时间,要好好加快进度才好。

     

    前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对而言比较简单,争取在这一篇博客里面讲完。

     

    2.1 键值对应的Map

    就如同网络搜索,根据关键字可找到对应的数据,程序设计中也常有这类需求,根据某个键(Key)来取得对应的值(Value)。可以事先利用java.util.Map接口的操作对象来建立键值对应数据,之后若要取得值,只要用对应的键就可以迅速取得。

     

    同样地,在学习Map相关API之前,先了解框架设计架构对正确使用API会有帮助。

     

    从图中我们可以看到,常用的Map操作类为java.util.HashMap与java.util.TreeMap,其继承自抽象类java.util.AbstractMap。至于java.HashTable是从JDK1.0就遗留下来的API,不建议使用,所以也不会多加讲述。但是它的子类Properties却非常频繁地被使用,因此将会一起介绍。

     

    2.2 使用HashMap

    Map的使用比较简单,所以我们先直接写一个关于HashMap的demo,根据指定的姓名获取对应的备注信息:

     1 import java.util.*;
     2 
     3 /**
     4  * HashMap的实验用例
     5  */
     6 public class Remarks {
     7     public static void main(String[] args) {
     8         Map<String, String> remarks = new HashMap<>();
     9         remarks.put("Jack", "一个高大帅气的小伙子");
    10         remarks.put("Jane", "一位落落大方的小淑女");
    11         remarks.put("Tom", "一个人到中年的怪大叔");
    12 
    13         Scanner scanner = new Scanner(System.in);
    14         System.out.print("请输出需要查询的姓名: ");
    15         String remark = remarks.get(scanner.nextLine());
    16         System.out.println(remark);
    17         System.out.println(remarks);
    18     }
    19 }

     

    要建立键值对应,可以使用put()方法,第一个自变量是键,第二个自变量是值。在Map框架当中,键是不会重复的,在这一点上跟之前学习过的Set类似。因为判断键是否重复要根据hashCode()方法和equals()方法,所以作为键的对象必须实现这两个方法,否则就会出错(如有需要,可以重新阅读Collection框架系列文章中的第二篇)。如果要取回跟键对应的值,我们要使用get()方法。

     

    在HashMap中建立键值对应之后,键是无序的,这可以在执行结果中看到。如果想让键是有序的,我们可以选择使用TreeMap.

     

    2.3 使用TreeMap

    我们刚才提到,TreeMap会对键进行排序,而排序就需要比较大小。

     

    在之前讲Collection的文章里曾经提到过,如果要比较大小,就要求参与比较的对象必须实现Comparable接口,或者是指定实现Comparator接口的对象,例如我们接下来要运行的两个demo:

     1 import java.util.*;
     2 
     3 /**
     4  * TreeMap的实验用例
     5  */
     6 public class Remarks {
     7     public static void main(String[] args) {
     8         Map<String, String> remarks = new TreeMap<>();
     9         remarks.put("Jack", "一个高大帅气的小伙子");
    10         remarks.put("Jane", "一位落落大方的小淑女");
    11         remarks.put("Tom", "一个人到中年的怪大叔");
    12         
    13         System.out.println(remarks);
    14     }
    15 }

     

    因此String本身就已经实现了Comparable接口,所以我们可以看到结果是根据键来排序的:

     

    假设我们想要看到相反的排序结果,那么我们可以用到之前就提到过的实现Comparator接口的方法:

     1 import java.util.*;
     2 
     3 /**
     4  * TreeMap的实验用例
     5  */
     6 class StringComparator implements Comparator<String> {
     7     @Override
     8     public int compare(String s1, String s2) {
     9         return -s1.compareTo(s2);
    10     }
    11 }
    12 
    13 public class Remarks {
    14     public static void main(String[] args) {
    15         Map<String, String> remarks = new TreeMap<>(new StringComparator());
    16         remarks.put("Jack", "一个高大帅气的小伙子");
    17         remarks.put("Jane", "一位落落大方的小淑女");
    18         remarks.put("Tom", "一个人到中年的怪大叔");
    19 
    20         System.out.println(remarks);
    21     }
    22 }

     

    创建TreeMap的时候指定了StringComparator对象,所以我们可以得到想要的结果:

     

    2.4 使用Properties

    虽然Properties有Map的行为,也可以使用put()设定键值对应、get()取得键对应的值,不过一般我们更多的是使用Properties的setPropertity()指定字符串类型的键值,getProperty()指定字符串类型的键,取回字符串类型的值,通常称为属性名称与属性值。例如这样的语句:

    1         Properties props = new Properties();
    2         props.setProperty("username", "jack");
    3         props.setProperty("password", "123456");
    4         System.out.println(props.getProperty("username"));
    5         System.out.println(props.getProperty("password"));

     

    使用Properties一般有两种常见方式,一是载入.properties文档,二是使用loadFromXML()方法加载.xml文档。由于篇幅关系,这里就不详细举例说明了。

     

    2.5 Map的键和值

    如果想取得Map中所有的键,或是想取得Map中所有的值该怎么做?Map虽然与Collection没有继承上的关系,然而却是彼此搭配的关系。

     

    如果想取得Map中所有的键,可以调用Map的keySet()方法返回Set对象。因为键是不重复的,所以我们很容易理解为什么用Set来返回。如果想取得Map中所有的值,则可以使用values()返回Collection对象。例如下面这个demo:

     1 import java.util.*;
     2 
     3 /**
     4  * Map的键和值实验用例
     5  */
     6 public class MapKeyValue {
     7     public static void main(String[] args) {
     8         Map<String, String> map = new HashMap<>();
     9         map.put("one","一");
    10         map.put("two","二");
    11         map.put("three","三");
    12 
    13         System.out.println("显示所有的键");
    14         foreach(map.keySet());
    15 
    16         System.out.println("显示所有的值");
    17         foreach(map.values());
    18     }
    19 
    20     public static void foreach(Iterable<String> iterable) {
    21         for(String element : iterable) {
    22             System.out.println(element);
    23         }
    24     }
    25 }

     

    运行之后,我们可以看到这样的结果:

     

    如果想要同时取得Map的键和值,可以使用entrySet()方法,返回一个Set对象。这个Set里面的每一个元素都是Map.Entry实例,可以调用getKey()方法取得键,调用getValue()方法取得值。

     

    2.6 Map框架小结

    相比Collection框架,Map框架较为简单,需要熟悉了解的常用类只有HashMap、TreeMap和Properties三种。也因为之前已经学习过Collection框架,有了相关的知识储备,所以在新的学习过程当中可以省下不少功夫,例如为什么Map的键必须实现hashCode()和equals()方法,为什么TreeMap的键必须实现Comparable接口或指定实现了Comparator接口的对象。

     

    这就体现出了之前我们常常提及的“熟悉框架架构”的重要性,不仅容易理解为什么要这样设计,还方便之后的记忆和使用。很多人学习JavaSE都会有一个问题,就是死记硬背API——在网上找到一些文章(往往写得不好),记住里面的一两句话就以为自己掌握了。其实,这远远不够。

     

    当然,熟悉API架构只是刚起步,更多的掌握过程要在大量的实际编程中实现。只要一开始动手写代码,你就会发现自己学来的东西是有用的。同时也会发现存在问题和漏洞,但是一旦查缺补漏完毕,你的水平将会上升不止一个层次。

    相关文章推荐:

    JavaSE中Collection集合框架学习笔记(1)——具有索引的List

    JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序 

    如果你喜欢我的文章,可以扫描关注我的个人公众号“李文业的思考笔记”。

    不定期地会推送我的原创思考文章。

     

     

  • 相关阅读:
    数据结构与算法10 微服务接口的鉴权和限流 [MD]
    .Net开发环境配置[OS/IIS/VS...]
    一、单件模式
    正则表达式调试器1.1
    C#2.0新特性系列文章转载
    巧用VS2005解决VS2005网站发布不便问题
    配置VS2005,加速VS2005运行速度
    转载:ASP.NET运行机制 和 图片盗链问题
    ASP.NET页面提前处理问题
    关于NTLM认证的python和.NET实现
  • 原文地址:https://www.cnblogs.com/levenyes/p/7163843.html
Copyright © 2011-2022 走看看