集是一个集合,它可以快速地查找现有的元素。但是,要查看一个元素,需要有查找元素的精确副本。这不是一种非常通用的查找方式。通常的情况下,我们直到某些键的信息,并想要查找与之对应的元素。
映射表数据结构就是为此设计的。映射表用来存放键/值对。如果提供了键,就能够查找到值。
例如,有一张关于员工信息的记录表,键为员工ID,值为Employee对象。
Java类库为映射表提供了两个通用的实现:HashMap和TreeMap。这两个类都实现了Map接口。
散列映射表对键进行散列,树映射表用键的整体顺序对元素进行排序,并将其组织为搜索树。
那么应该选择散列映射表还是树映射表呢?与集一样,散列稍微快一点,如果不需要按照排列顺序访问键,就最好选择散列。
下面代码将为存储的员工信息建立一个散列映射表:
Map<String,Employee> staff=new HashMap<>();
Employee harry=new Employee("Harry Hacker");
staff.put("987-98-9996",harry);
每当往映射表中添加对象时,必须同时提供一个键。在这里,键是一个字符串,对应的值是Employee对象。
想要检索一个对象,必须提供一个键。
String s="987-98-9996";
e=staff.get(s);
如果在映射表中没有与给定键对应的信息,get将返回null。
键必须是唯一的。不能对同一键存放两个值。如果对同一个键两次调用put方法,第二个值就会取代第一个值。remove方法用于从映射表中删除给定键对应的元素。size方法用于返回映射表中的元素数。
示例程序显示了映射表的操作过程。首先将键/值对添加到映射表中,然后,从映射表中删除一个键,同时与之对应的值也被删除掉了。接下来,修改与某一个键对应的值,并调用get方法查看这个值。最后,对条目集进行迭代。
package Collections;
import inheritance.Employee;
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args){
Map<String,Employee>staff=new HashMap<>();
staff.put("144-25-5464",new Employee("Amy Lee", 10000));
staff.put("567-24-2546",new Employee("Harry Hacker",8000));
staff.put("157-62-7935",new Employee("Gary Cooper",5000));
staff.put("456-62-5527",new Employee("Francesca Cruz",3000));
System.out.println(staff);
staff.remove("567-24-2546");
staff.put("456-62-5527", new Employee("Francesca Miller",3500));
System.out.println(staff.get("157-62-7935"));
for(Map.Entry<String, Employee> entry:staff.entrySet()){
String key=entry.getKey();
Employee value=entry.getValue();
System.out.println("key="+key+",value="+value);
}
}
}