JavaSE中Map框架学习笔记

简介:

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

















本文转自xsster51CTO博客,原文链接: http://blog.51cto.com/12945177/1948474,如需转载请自行联系原作者





相关文章
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
563 3
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
299 3
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
243 2
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
233 2
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
263 2
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
540 2
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
501 2
|
6月前
|
安全 Java API
【Java性能优化】Map.merge()方法:告别繁琐判空,3行代码搞定统计累加!
在日常开发中,我们经常需要对Map中的值进行累加统计。}else{代码冗长,重复调用get()方法需要显式处理null值非原子操作,多线程下不安全今天要介绍的方法,可以让你用一行代码优雅解决所有这些问题!方法的基本用法和优势与传统写法的对比分析多线程安全版本的实现Stream API的终极优化方案底层实现原理和性能优化建议一句话总结是Java 8为我们提供的Map操作利器,能让你的统计代码更简洁、更安全、更高效!// 合并两个列表});简单累加。
602 0
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
263 1
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
477 4