国外网站icp备案,wordpress链接过期,电影网站做淘客,个人建网站成本概要#xff1a;
java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。
Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对#xff08;称作“键”和“值”#xff09;#xff0c;其中每个键映射到一个值。 本文主要介绍java ma…概要
java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。
Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对称作“键”和“值”其中每个键映射到一个值。 本文主要介绍java map的初始化、用法、map的四种常用的遍历方式、map的排序以及常用api
类型介绍
Java 自带了各种 Map 类。这些 Map 类可归为三种类型
1. 通用Map用于在应用程序中管理映射通常在 java.util 程序包中实现
HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap、ConcurrentHashMap
2. 专用Map通常我们不必亲自创建此类Map而是通过某些其他类对其进行访问
java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults
3. 一个用于帮助我们实现自己的Map类的抽象类
AbstractMap 类型区别
HashMap
最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的
TreeMap
能够把它保存的记录根据键(key)排序,默认是按升序排序也可以指定排序的比较器当用Iterator 遍历TreeMap时得到的记录是排过序的。TreeMap不允许key的值为null。非同步的 Hashtable
与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢 LinkedHashMap
保存了记录的插入顺序在用Iterator遍历LinkedHashMap时先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空非同步的 Map 初始化 MapString, String map new HashMapString, String(); 插入元素 map.put(key1, value1);
获取元素 map.get(key1)
移除元素 map.remove(key1);
清空map map.clear(); 测试代码
public class Test {static int hashMapW 0;static int hashMapR 0;static int linkMapW 0;static int linkMapR 0;static int treeMapW 0;static int treeMapR 0;static int hashTableW 0;static int hashTableR 0;public static void main(String[] args) {for (int i 0; i 10; i) {Test test new Test();test.test(100 * 10000);System.out.println();}System.out.println(hashMapW hashMapW / 10);System.out.println(hashMapR hashMapR / 10);System.out.println(linkMapW linkMapW / 10);System.out.println(linkMapR linkMapR / 10);System.out.println(treeMapW treeMapW / 10);System.out.println(treeMapR treeMapR / 10);System.out.println(hashTableW hashTableW / 10);System.out.println(hashTableR hashTableR / 10);}public void test(int size) {int index;Random random new Random();String[] key new String[size];// HashMap 插入MapString, String map new HashMapString, String();long start System.currentTimeMillis();for (int i 0; i size; i) {key[i] UUID.randomUUID().toString();map.put(key[i], UUID.randomUUID().toString());}long end System.currentTimeMillis();hashMapW (end - start);System.out.println(HashMap插入耗时 (end - start) ms);// HashMap 读取start System.currentTimeMillis();for (int i 0; i size; i) {index random.nextInt(size);map.get(key[index]);}end System.currentTimeMillis();hashMapR (end - start);System.out.println(HashMap读取耗时 (end - start) ms);// LinkedHashMap 插入map new LinkedHashMapString, String();start System.currentTimeMillis();for (int i 0; i size; i) {key[i] UUID.randomUUID().toString();map.put(key[i], UUID.randomUUID().toString());}end System.currentTimeMillis();linkMapW (end - start);System.out.println(LinkedHashMap插入耗时 (end - start) ms);// LinkedHashMap 读取start System.currentTimeMillis();for (int i 0; i size; i) {index random.nextInt(size);map.get(key[index]);}end System.currentTimeMillis();linkMapR (end - start);System.out.println(LinkedHashMap读取耗时 (end - start) ms);// TreeMap 插入key new String[size];map new TreeMapString, String();start System.currentTimeMillis();for (int i 0; i size; i) {key[i] UUID.randomUUID().toString();map.put(key[i], UUID.randomUUID().toString());}end System.currentTimeMillis();treeMapW (end - start);System.out.println(TreeMap插入耗时 (end - start) ms);// TreeMap 读取start System.currentTimeMillis();for (int i 0; i size; i) {index random.nextInt(size);map.get(key[index]);}end System.currentTimeMillis();treeMapR (end - start);System.out.println(TreeMap读取耗时 (end - start) ms);// Hashtable 插入key new String[size];map new HashtableString, String();start System.currentTimeMillis();for (int i 0; i size; i) {key[i] UUID.randomUUID().toString();map.put(key[i], UUID.randomUUID().toString());}end System.currentTimeMillis();hashTableW (end - start);System.out.println(Hashtable插入耗时 (end - start) ms);// Hashtable 读取start System.currentTimeMillis();for (int i 0; i size; i) {index random.nextInt(size);map.get(key[index]);}end System.currentTimeMillis();hashTableR (end - start);System.out.println(Hashtable读取耗时 (end - start) ms);}
}
四种常用Map插入与读取性能比较
测试环境 jdk1.7.0_80
测试结果 Map 遍历
初始化数据 MapString, String map new HashMapString, String(); map.put(key1, value1); map.put(key2, value2); 增强for循环遍历
使用keySet()遍历 for (String key : map.keySet()) { System.out.println(key map.get(key)); } 使用entrySet()遍历 for (Map.EntryString, String entry : map.entrySet()) { System.out.println(entry.getKey() entry.getValue()); } 迭代器遍历
使用keySet()遍历 IteratorString iterator map.keySet().iterator(); while (iterator.hasNext()) { String key iterator.next(); System.out.println(key map.get(key)); } 使用entrySet()遍历 IteratorMap.EntryString, String iterator map.entrySet().iterator(); while (iterator.hasNext()) { Map.EntryString, String entry iterator.next(); System.out.println(entry.getKey() entry.getValue()); } 总结 增强for循环使用方便但性能较差不适合处理超大量级的数据 迭代器的遍历速度要比增强for循环快很多是增强for循环的2倍左右 使用entrySet遍历的速度要比keySet快很多是keySet的1.5倍左右 Map 排序 HashMap、Hashtable、LinkedHashMap排序
TreeMap也可以使用此方法进行排序但是更推荐下面的方法
MapString, String map new HashMapString, String();
map.put(a, c);
map.put(b, b);
map.put(c, a);// 通过ArrayList构造函数把map.entrySet()转换成list
ListMap.EntryString, String list new ArrayListMap.EntryString, String(map.entrySet());
// 通过比较器实现比较排序
Collections.sort(list, new ComparatorMap.EntryString, String() {public int compare(Map.EntryString, String mapping1, Map.EntryString, String mapping2) {return mapping1.getKey().compareTo(mapping2.getKey());}
});for (Map.EntryString, String mapping : list) {System.out.println(mapping.getKey() mapping.getValue());
}
TreeMap排序
TreeMap默认按key进行升序排序如果想改变默认的顺序可以使用比较器:
MapString, String map new TreeMapString, String(new ComparatorString() {public int compare(String obj1, String obj2) {return obj2.compareTo(obj1);// 降序排序}
});
map.put(a, c);
map.put(b, b);
map.put(c, a);for (String key : map.keySet()) {System.out.println(key map.get(key));
}
按value排序(通用)
MapString, String map new TreeMapString, String();map.put(a, c);map.put(b, b);map.put(c, a);// 通过ArrayList构造函数把map.entrySet()转换成listListMap.EntryString, String list new ArrayListMap.EntryString, String(map.entrySet());// 通过比较器实现比较排序Collections.sort(list, new ComparatorMap.EntryString, String() {public int compare(Map.EntryString, String mapping1, Map.EntryString, String mapping2) {return mapping1.getValue().compareTo(mapping2.getValue());}});for (String key : map.keySet()) {System.out.println(key map.get(key));}
常用API
clear()从 Map 中删除所有映射remove(Object key)从 Map 中删除键和关联的值put(Object key, Object value)将指定值与指定键相关联putAll(Map t)将指定 Map 中的所有映射复制到此 mapentrySet()返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象可以使用 getKey() 和 getValue() 方法还有一个 setValue() 方法访问后者的键元素和值元素keySet()返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射键和值values()返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射键和值get(Object key)返回与指定键关联的值containsKey(Object key)如果 Map 包含指定键的映射则返回 truecontainsValue(Object value)如果此 Map 将一个或多个键映射到指定值则返回 trueisEmpty()如果 Map 不包含键-值映射则返回 truesize()返回 Map 中的键-值映射的数目