映射
集是一个集合,它可以快速地查找现有的元素。但是,要查看一个元素,需要有要查找元素的精确副本。通常,我们知道某些键的信息,并想要查找与之对应的元素。映射(map)数据结构就是为此设计的。
(一)基本映射操作
Java类库为映射提供了两个通用的实现:HashMap和TreeMap。这两个类都实现了Map接口。
HashMap:散列映射,对键进行散列
TreeMap:树映射,用键的整体顺序对元素进行排序,并将其组成搜索树。
散列或比较函数只作用于键,而不作用于键所对应的值。
每当往映射里添加一个对象时,必须同时提供一个键。并且键必须是唯一的,不能同一个键存放两个值。如果对同一个键调用两次put方法,那么第二次的值会覆盖掉第一次的值。remove方法会从映射中删除给定键对应的元素。
package map;
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
Map<String,Employee> map = new HashMap<String,Employee>();
map.put("144-25-5464", new Employee("Amy Lee"));
map.put("567-24-2546", new Employee("Harry Hacker"));
map.put("157-62-7935", new Employee("Gary Cooper"));
map.put("456-62-5527", new Employee("Francesca Cruz"));
System.out.println(map);
map.remove("567-24-2546");
map.put("456-62-5527", new Employee("Francesca Miller"));
System.out.println(map.get("157-62-7935"));
map.forEach((k,v)->System.out.println("key="+k+",value="+v));
}
}
(二)更新映射项
更新映射项有三种方法,例如有个例子,我们统计一个单词在文件中出现的次数,看到一个单词时,就将计数器增加1。
①counts.put(word,counts.get(word)+1);这种方法是有前提的,除非不是第一次出现,如果是第一次出现,get方法会返回null。出现NullPointerException
为了避免异常情况,所以我们用下面这个方式:
②counts.put(word,counts.getOrDefault(word,0)+1);
③counts.merge(word,1,Integer::sum);
(三)映射视图
我们所知的映射视图有3种,①键集,②值集合,③键/值集
所以有下面三个方法可以返回这3个视图:
①Set<K> keySet(),②Collection<V> values(),③Set<Map.Entry<K,V>> entrySet()
package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
Map<String,Employee> map = new HashMap<String,Employee>();
map.put("144-25-5464", new Employee("Amy Lee"));
map.put("567-24-2546", new Employee("Harry Hacker"));
map.put("157-62-7935", new Employee("Gary Cooper"));
map.put("456-62-5527", new Employee("Francesca Cruz"));
Set<String> keyView = map.keySet();
for(String key : keyView) {
System.out.println(key);
}
Collection<Employee> c = map.values();
for(Employee e : c) {
System.out.println(e.toString());
}
for(Map.Entry<String, Employee> entry : map.entrySet()) {
String key = entry.getKey();
Employee e = entry.getValue();
System.out.println("key="+key+",value="+e.toString());
}
}
}