Java集合框架之图解(更新中...)
关于图我们该如何理解呢?!看看下面一个应用场景
假设程序存储了一百万个学生,而且需要按照其学号进行检索,那么怎样的方式有效?
此时有效的数据结构就是图(map) 按照键值对存储元素的容器(键值可以是任意类型的对象,即泛型的威力),map中不能有重复的Key,但是value值可以相同,key和value组成一个条目,图中存储的为此条目。示意图如下(画的很糟糕,见谅!):
图的类型:
散列图:hashMap、链式散列图LinkedHashMap、树形图TreeMap。其都定义在Map接口中,其关系如下:
Map接口提供了查询、更新和获取集合的值和集合键值的方法。
更新方法(update methods)包括clear、put、putAll、remove
查询方法(query methods)包括containsKey、containsValue、isEmpty和sized
======================================================================================================
AbstractMap类是一个便利类,实现了Map接口中除了entrySet()方法之外的所有方法。
SortedMap接口扩展了Map接口,并保持映射以键值升序的顺序排列。除此之外还有附加方法firstKey()和lastKey()以返回最低键值和最高键值,headMap(toKey)返回值小于toKey的那部分图,而tailMap(fromKey)返回键值大于或等于fromKey的那部分图。
HashMap、LinkedMap和TreeMap类是Map接口的具体实现
三种具体实现类在何时使用时最有效呢?!答案在下面
HashMap:对于定位一个值,插入一个映射以及删除一个映射,适宜使用HashMap
LinkedHashMap:由其类名可知,LinkedHashMap是用链表实现来扩展HashMap类,LinkedHashMap支持图中的条目排序。而HashMap中的条目是没有顺序的,但在LinkedHashMap中,元素既可以按照他们插入图的顺序排序(插入排序)也可以按照他们最后一次被访问时的顺序,从最早到最晚(访问排序(access order))。无参构造方法是以插入顺序来创建LinkedHashMap对象的。要按访问顺序创建LinkedHashMap对象,应该使用构造方法LinkedHashMap(initialCapacity,loadFactor,true).
TreeMap在遍历排好顺序的键值时是最高效的。键值可以使用Comparable接口或Comparator接口类来排序。
看个简单的案例理解一下:
import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; public class testMap { public static void main(String[] args) { //create a HashMap Map<String, Integer> hashMap = new HashMap<String,Integer>(); hashMap.put("张三", 32); hashMap.put("李四", 21); hashMap.put("王五", 22); System.out.println("Display entries is HashMap"); System.out.println(hashMap + "\n"); //create a TreeMap from the previous HashMap Map< String, Integer> treeMap = new TreeMap<String,Integer>(hashMap); System.out.println("Display entries in ascending order of key"); System.out.println(treeMap); //create a LinkedHashMap Map<String, Integer> linkedHashMap = new LinkedHashMap<String,Integer>(15,0.75f,true); linkedHashMap.put("张三",31); linkedHashMap.put("李四",28); linkedHashMap.put("王五",29); linkedHashMap.put("赵六",29); //Display System.out.println("Display entries in LinkedHashMap"); System.out.println(linkedHashMap); } }
那么运行结果呢:
Display entries is HashMap {张三=32, 李四=21, 王五=22} Display entries in ascending order of key {张三=32, 李四=21, 王五=22} Display entries in LinkedHashMap {张三=31, 李四=28, 王五=29, 赵六=29}
HashMap的输出顺序是随机的,TreeMap中的条目是按键值的升序排列的,LinkedHashMap是按元素最后一次被访问的时间从早到晚排序的