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和收集对象后的排序
如果你喜欢我的文章,可以扫描关注我的个人公众号“李文业的思考笔记”。
不定期地会推送我的原创思考文章。
转载于:https://www.cnblogs.com/levenyes/p/7163843.html
JavaSE中Map框架学习笔记相关推荐
- SpringMVC框架--学习笔记(上)
1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...
- Spring框架学习笔记(三)(AOP,事务管理)
Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...
- Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )
Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...
- 27Vert.X框架学习笔记
vert.x框架学习笔记 文章目录 1 Vert.x简明介绍 1.1 Vert.x能干什么 1.2 Vert.x快速体验 1.3 Vert.x的简单介绍 1.4 Vert.x的一些优势 1.4.1 异 ...
- SpringMVC框架--学习笔记(下)
接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...
- mybatis框架--学习笔记(下)
上篇:mybatis框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81034021 8.高级映射: (1)一对一查询: ①使 ...
- mybatis框架--学习笔记(上)
使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...
- React学习:事件绑定、组件定义、for、map循环-学习笔记
文章目录 React学习:事件绑定.组件定义.for.map循环-学习笔记 事件绑定 组件定义 (参数传递) for.map循环 React学习:事件绑定.组件定义.for.map循环-学习笔记 事件 ...
- python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式
本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...
最新文章
- 2021年深度学习哪些方向比较有研究潜力?
- Fragment第二次加载没有数据
- 50代码HTML5 Canvas 3D 编辑器优雅搞定
- #论文 《Wide Deep Learning for Recommender System》翻译
- Centos安装Xen总结
- 苹果显示已连接网络连接到服务器异常,苹果确认iphone密码,显示连接服务器出现问题,为什么...
- JAVA面试常考系列十一
- 第 6-5 课:MyBatis 核心和面试题(下)
- [C++基础]037_编写不可被继承的类
- js与C#服务端 json数据交互
- Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸
- HDFS的读写限流方案
- pytorch-----使用Module类来自定义模型
- TFS2018环境搭建一硬件要求
- Birth-Death process 生灭过程
- 国外免费图片素材站收集
- 《菜鸟教程》C语言学习
- 输出两个数之间的水仙花数C++
- R 数据正态分布检验
- 如何参与linux内核开发
热门文章
- latex 新定义环境 引用_炉石传说:完全虐杀式上分!新版本第二天动物园迅速定义环境!...
- javabean反射改字段内容_java反射机制给实体类相同字段自动赋值实例
- 河北省单招计算机类考试考英语吗,2019年河北省高职单招考试十类 和对口电子电工类、计算机类联考 专业基础考试(英语)考试大纲.doc...
- k8s中使用MySQL共享存储_Kubernetes创建挂载共享存储的容器
- html实体转化字符串 php_PHP htmlentities() 函数
- 数据包如何正确的发到目的地_江苏工业交换机厂家浅谈交换机如何应用
- 字符串相乘Python解法
- altium如何制作mark点_如何选择一家优质的网站制作公司,看这2点
- google提供的adb工具包_开源化学信息学工具包(Open Access Cheminformatics Toolkits)
- 各种Arduino外设的用法,生动形象,相当好看!