HashMap<K, V>也是一个很实用的类,HashMap<K, V>对象采用散列表这种数据结构存储数据,习惯上称HashMap<K, V>对象为散列映射对象。散列映射用于存储键值数据对,允许把任何数量的键值数据对存储在一起。键不可以发生逻辑冲突,两个数据项不要使用相同的键,如果出现两个数据项对应相同的键,那么先前散列映射中的键值对将被替换。散列映射在它需要更多的存储空间时会自动增大容量。例如,如果散列映射的装载因子是0.75,那么当散列映射的容量被使用了75%时,它就把容量增加到原来容量的2倍。对于数组和链表这两种数据结构,如果要查找它们存储的某个特定的元素却不知道它的位置,就需要从头开始访问元素直到找到匹配的为止;如果数据结构中包含很多的元素,就会浪费时间。这时最好使用散列映射来存储要查找的数据,使用散列映射可以减少检索的开销。
1、HashMap<K, V>对象
HashMap<K, V>泛型类创建的对象称为散列映射。例如:
HashMap<String, Student> hashtable = HashMap<String, Student>();
那么,hashtable 就可以存储键值对数据,其中的键必须是一个String对象,键对应的值必须是Student对象。hashtable可以调用public V put(K key, V value)方法将键值对数据存储放到散列映射中,同时返回键所对应的值。
2、常用方法
HashMap<K, V> 泛型类的常用方法如下。
①public void clear() —— 清空散列映射
②public Object clone() —— 返回当前散列映射的一个克隆
③public boolean containsKey(Object key) —— 如果散列映射有键值对使用了参数指定的键,方法返回true,否则返回false
④public boolean containsValue(Object value) —— 如果散列映射有键值对的值是参数指定的值,方法返回true,否则返回false
⑤public V get(Object key) —— 返回散列映射中使用key作为键的键值对的值
⑥public boolean isEmpty() —— 如果散列映射不含任何键值对,方法返回true,否则返回false
⑦public V remove(Object key) —— 删除散列映射中键为参数指定的键值对,并返回键对应的值
⑧public int size() —— 返回散列映射的大小,即散列映射中键值对的数目
3、遍历散列映射
如果想获得散列映射中所有键值对中的值,首先使用
public Collection<V> values()
方法返回一个实现Collection<V>接口类创建的对象的引用,并要求将该对象的引用返回到Collection<V>接口变量中。values()方法返回的对象中存储了散列映射中所有键值对中的值,这样接口变量就可以调用类实现的方法,如获取Iterator对象,然后输出所有的值。
例:使用散列映射的常用方法,并遍历散列映射
package com.chindroid.date;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
public class TestHashMap {
public static void main(String[] args) {
Book book1 = new Book("7302033218", "C++基础教程");
Book book2 = new Book("7808315162", "Java编程语言");
Book book3 = new Book("7302054991", "J2ME无线设备编程");
HashMap<String, Book> table = new HashMap<String, Book>();
table.put(book1.ISBN, book1);
table.put(book2.ISBN, book2);
table.put(book3.ISBN, book3);
String key = "7808315162";
if(table.containsKey(key)){
System.out.println(table.get(key).name + "有货");
}
Book b = table.get("7302054991");
System.out.println("书名:"+b.name+", ISBN:"+b.ISBN);
int number = table.size();
System.out.println("散列映射中有"+number+"个元素:");
Collection<Book> collection = table.values();
Iterator<Book> iter = collection.iterator();
while(iter.hasNext()){
Book te = iter.next();
System.out.printf("书名:%s, ISBN: %s\n", te.name, te.ISBN);
}
}
}
程序运行结果如下
Java编程语言有货
书名:J2ME无线设备编程, ISBN:7302054991
散列映射中有3个元素:
书名:C++基础教程, ISBN: 7302033218
书名:J2ME无线设备编程, ISBN: 7302054991
书名:Java编程语言, ISBN: 7808315162
4、HashMap<E>泛型类实现的接口
HashMap<E>泛型类实现了泛型接口Map<E>,其中的绝大部分方法都是Map<E>接口方法的实现。编程时,可以使用接口回调技术,即把HashMap<E>对象的引用赋值给Map<E>接口变量,那么接口就可以调用类实现的接口方法。