当前位置:编程学习 > JAVA >>

java hashMap简单使用以及深度分析

java.util
类 HashMap<K,V>
java.lang.Object
  java.util.AbstractMap<K,V>
      java.util.HashMap<K,V>
类型参数:
K - 此映射所维护的键的类型
V - 所映射值的类型
所有已实现的接口:
Serializable, Cloneable, Map<K,V>
直接已知子类:
LinkedHashMap, PrinterStateReasons

 


--------------------------------------------------------------------------------

 


public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable基于哈希表的 Map 接口的实现。


特点:
(1)此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)
(2)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
(3)此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。

 


迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。

 


所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。

 


HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。
(1)容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。
(2)加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。

 


当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

 


通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。
      加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。
      在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。


      如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。


      如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。

 

 

 


          注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。
(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)
这一般通过对自然封装该映射的对象进行同步操作来完成。

 


如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。
最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:

 


   Map m = Collections.synchronizedMap(new HashMap(...));
  
   由所有此类的“collection 视图方法”所返回的迭代器都是快速失败 的:
在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,
其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。


因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。

 


注意,迭代器的快速失败行为不能得到保证,一般来说,存在非同步的并发修改时,不可能作出任何坚决的保证。
快速失败迭代器尽最大努力抛出 ConcurrentModificationException。

 


因此,编写依赖于此异常的程序的做法是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。

 


此类是 Java Collections Framework 的成员。

 


(1)
containsKey
public boolean containsKey(Object key)如果此映射包含对于指定键的映射关系,则返回 true。

 


指定者:
接口 Map<K,V> 中的 containsKey
覆盖:
类 AbstractMap<K,V> 中的 containsKey
参数:
key - 要测试其是否在此映射中存在的键
返回:
如果此映射包含对于指定键的映射关系,则返回 true。

 


(2)
keySet
public Set<K> keySet()返回此映射中所包含的键的 Set 视图。该 set 受映射的支持,所以对映射的更改将反映在该 set 中,反之亦然。如果在对 set 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作除外),则迭代结果是不确定的。该 set 支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。

 


指定者:
接口 Map<K,V> 中的 keySet
覆盖:
类 AbstractMap<K,V> 中的 keySet
返回:

此映射中包含的键的 set 视图【有关   set  使用  见下文。】

 


下面借鉴一个实例演示解析:


[java] public class HashMapTest { 
    public static void main(String[] args) { 
         
        HashMap<String,String> keySetMap = new HashMap<String,String>(); 
        HashMap<String,String> entrySetMap=new HashMap<String,String>(); 
         
        for (int i= 0;i<1000;i++) { 
            keySetMap.put(""+i, "keySet"); 
        } 
        for(int i=0;i<1000;i++){ 
            entrySetMap.put(""+i,"entrySet"); 
        } 
         
        long startTimeOne = System.currentTimeMillis(); 
        Iterator<String> keySetIterator = keySetMap.keySet().iterator(); 
        while (keySetIterator.hasNext()) { 
            System.out.println(keySetMap.get(keySetIterator.next())); 
        } 
        System.out.println("keyset遍历时间-------------------------------:"+(System.currentTimeMillis()-startTimeOne)); 
         
        long startTimeTwo=System.currentTimeMillis(); 
        Iterator<Entry<String,String>> entrySetIterator=entrySetMap.entrySet().iterator(); 
        while(entrySetIterator.hasNext()){ 
            Entry<String,String> entry=entrySetIterator.next(); 
            System.out.println(entry.getValue()); 
        } 
        System.out.println("entryset遍历时间---------------------------:"+(System.currentTimeMillis()-startTimeTwo)); 
    } 

public class HashMapTest {
    public static void main(String[] args) {
     
        HashMap<String,String> keySetMap = new HashMap<String,String>();
      &nbs

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,