Java Map学习总结
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象. Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象.
Map 类可归为三种类型:
I。通用 Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现
HashMap
Hashtable
Properties
LinkedHashMap
IdentityHashMap
TreeMap
WeakHashMap
ConcurrentHashMap
II。专用 Map,您通常不必亲自创建此类 Map,而是通过某些其他类对其进行访问
java.util.jar.Attributes
javax.print.attribute.standard.PrinterStateReasons
java.security.Provider
java.awt.RenderingHints
javax.swing.UIDefaults
III。一个用于帮助实现您自己的 Map 类的抽象类
AbstractMap
Map是一个接口,实例化Map可以采用下面的方式:
HashMap:Map基于散列表的实现.插入和查询“键值对”的开销是固定的.可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能.
LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序.只比HashMap慢一点.而在迭代访问时发而更快,因为它使用链表维护内部次序.
TreeMap:底层是二叉树数据结构,线程不同步,可用于给Map集合中的键进行排序.
HashTable:HashMap是Hashtable的轻量级实现,非线程安全的实现他们都实现了map接口,主要区别是HashMap键值可以为空null,效率可以高于Hashtable.
ConcurrentHashMap:ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap.
WeakHashMap:弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的.如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收.
IdentifyHashMap:使用==代替equals()对“键”作比较的hash map
ArrayMap:ArrayMap是一个映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value值,它和SparseArray一样,也会对key使用二分法进行从小到大排序,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作,所以,应用场景和SparseArray的一样,如果在数据量比较大的情况下,那么它的性能将退化至少50%.
SparseArray:SparseArray比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱(int转为Integer类型),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间.
Map的基本操作:
boolean containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true.
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true.
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图.
boolean equals(Object o)
比较指定的对象与此映射是否相等.
V get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null.
int hashCode()
返回此映射的哈希码值.
boolean isEmpty()
如果此映射未包含键-值映射关系,则返回 true.
Set<K> keySet()
返回此映射中包含的键的 Set 视图.
V put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作).
void putAll(Map<? extends K,? extends V> m)
从指定映射中将所有映射关系复制到此映射中(可选操作).
V remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作).
int size()
返回此映射中的键-值映射关系数.
Collection<V> values()
返回此映射中包含的值的 Collection 视图.
HashMap举例
Map hashMap =newHashMap<>();
for(inti =0; i < maxCount; i++) {
hashMap.put(i,String.valueOf(i));
}
遍历entrySet方式
long start = System.currentTimeMillis();
for(Map.Entry entry : hashMap.entrySet()) {
Integer key=entry.getKey();
String value=entry.getValue();
System.out.println("key: "+ key +"value: "+value);
}
long end = System.currentTimeMillis();
System.out.println("for-each方式 cost time : "+ (end - start));
entrySet迭代器遍历方式
long start1 = System.currentTimeMillis();
Iterator> entries = hashMap.entrySet().iterator();
while(entries.hasNext()) {
Map.Entry entry = entries.next();
Integer key=entry.getKey();
Stringvalue=entry.getValue();
System.out.println("key: "+ key +"value: "+value);
}
long end1 = System.currentTimeMillis();
System.out.println("entrySet iterator迭代器 cost time : "+ (end1 - start1));
键找值遍历
long end1 = System.currentTimeMillis();
System.out.println("iterator迭代器 cost time : "+ (end1 - start1));
long start2 = System.currentTimeMillis();
for (Integerkey: hashMap.keySet()) {
String value= hashMap.get(key);
System.out.println("key: "+key+"value: "+value);
}
long end2 = System.currentTimeMillis();
System.out.println("键找值遍历 cost time : "+ (end2 - start2));
keySet迭代器遍历
long start3 = System.currentTimeMillis();
Iterator iterator=hashMap.keySet().iterator();
while(iterator.hasNext()) {
Integerkey=iterator.next();
Stringvalue=hashMap.get(key);
System.out.println("key: "+key+"value: "+value);
}
long end3 = System.currentTimeMillis();
System.out.println("keySet iterator迭代器 cost time : "+ (end3 - start3));
JAVA/203.html">http://www.itemperor.com/a/JAVA/203.html
原文链接:http://www.jxszl.com/biancheng/JAVA/446555.html