开课吧Java课堂:什么是HashMap类

129 阅读2分钟

HashMap类使用散列表实现Map接口。这允许一些基本操作如get( )和put( )的运行时间保持恒定,即便对大型集合,也是这样的。 下面的构造函数定义为:

HashMap( ) 
HashMap(Map m) 
HashMap(int capacity) 
HashMap(int capacity, float fillRatio) 

第一种形式构造一个默认的散列映射。 第二种形式用m的元素初始化散列映射。 第三种形式将散列映射的容量初始化为capacity。 第四种形式用它的参数同时初始化散列映射的容量和填充比。 容量和填充比的含义与前面介绍的HashSet中的容量和填充比相同。

HashMap实现Map并扩展AbstractMap。它本身并没有增加任何新的方法。

应该注意的是散列映射并不保证它的元素的顺序。因此,元素加入散列映射的顺序并不一定是它们被迭代函数读出的顺序。

下面的程序举例说明了HashMap。它将名字映射到账目资产平衡表。注意集合“视图” 是如何获得和被使用的。

import java.util.*; 
class HashMapDemo { 
 public static void main(String args[]) { 
 // Create a hash map 
 HashMap hm = new HashMap(); 
 // Put elements to the map 
 hm.put("John Doe", new Double(3434.34)); 
 hm.put("Tom Smith", new Double(123.22)); 
 hm.put("Jane Baker", new Double(1378.00)); 
 hm.put("Todd Hall", new Double(99.22)); 
 hm.put("Ralph Smith", new Double(-19.08)); 
 // Get a set of the entries 
 Set set = hm.entrySet(); 
 // Get an iterator 
 Iterator i = set.iterator(); 
 // Display elements 
 while(i.hasNext()) { 
 Map.Entry me = (Map.Entry)i.next(); 
 System.out.print(me.getKey() + ": "); 
 System.out.println(me.getValue()); 
 } 
 System.out.println(); 
 // Deposit 1000 into John Doe's account 
 double balance = ((Double)hm.get("John Doe")).doubleValue(); 
 hm.put("John Doe", new Double(balance + 1000)); 
 System.out.println("John Doe's new balance: " + 
 hm.get("John Doe")); 
 } 
} 

该程序的输出如下所示:

Todd Hall: 99.22 
Ralph Smith: -19.08 
John Doe: 3434.34 
Jane Baker: 1378.0 
Tom Smith: 123.22 
John Doe’s current balance: 4434.34 

程序开始创建一个散列映射,然后将名字的映射增加到平衡表中。接下来,映射的内容通过使用由调用函数entrySet( )而获得的集合“视图”而显示出来。

关键字和值通过调用由Map.Entry定义的getKey( )和getValue( )方法而显示。

注意存款是如何被制成John Doe的账目的。put( )方法自动用新值替换与指定关键字相关联的原先的值。因此,在John Doe的账目被更新后,散列映射将仍然仅仅保留一个“John Doe”账目。