集合(List)能夠快速地查找現有的元素。可是,要查看一個元素,須要有要查找元素的精確副本。這不是一種很是通用的查詢方式。一般,若是知道某些鍵的信息,並想要查找與之對應的元素,則可使用映射表(map)。java
Java類庫中提供了兩個通用的實現:HashMap和TreeMap。它們都實現了Map接口。 數據結構
散列映射表HashMap對鍵進行散列,樹映射表TreeMap用鍵的總體順序對元素進行排序,並將其組織成搜索樹。散列或比較函數只能做用於鍵。與鍵關聯的值不能進行散列或比較。框架
這兩個Map的性能哪一個更好呢?與集合同樣,散列稍微快一些。若是不須要按照排列順序訪問鍵,就最好選擇散列。函數
每當往映射表裏添加對象時,必須同時提供一個對象的鍵(key),鍵是一個字符串,對應的值能夠是對象。性能
@Test public void HashMapTest() { HashMap<String, Task> map = new HashMap<String, Task>(); Task task1 = new Task("task1", 1); Task task2 = new Task("task2", 2); Task task3 = new Task("task3", 3); map.put("t1", task1); map.put("t2", task2); map.put("t3", task3); System.out.println(map.get("t1").name); /** * output:task1 * */ Task task4 = new Task("task4", 4); map.put("t1", task4); System.out.println(map.get("t1").name); /** * output:task4 * */ System.out.println(map.get("t5")); /** * output:null * */ // 在map中刪除一項。3-1=2。 map.remove("t1"); System.out.println(map.size()); /** * output:2 * */ }
如上面的代碼所見,在put時候將對象放入map,若是對同一個鍵兩次調用put方法,第二個值就會取代第一個值。若是在映射表中沒有與給定鍵對應的信息,get將返回null。code
remove方法用於刪除給定鍵對應的元素,size方法用於返回元素表中的元素數量。對象
集合框架並無將映射表自己視爲一個集合(其餘的數據結構框架則將映射表視爲pairs的集合,也就是對兒的集合,一對的意思,或者視爲用鍵做爲索引的值的集合)。然而,能夠得到映射表的視圖。視圖實現了Collection接口對象。排序
有三個視圖,分別是鍵集合、值集合和鍵/值集合:索引
Set<K> KeySet();接口
Collection<K> values();
Set<Map.Entry<K,V>> enterSet();
第一個KeySet既不是HashSet也不是TreeSet,而是實現了Set接口的某個其餘類的對象。Set接口拓展了Collection接口。所以,能夠與使用任何集合同樣使用KeySet。
使用keyset的代碼以下:
@Test public void HashMapTest() { HashMap<String, Task> map = new HashMap<String, Task>(); Task task1 = new Task("task1", 1); Task task2 = new Task("task2", 2); Task task3 = new Task("task3", 3); map.put("t1", task1); map.put("t2", task2); map.put("t3", task3); Set<String> keys = map.keySet(); for(String key : keys) System.out.println(key); /** * output: * t1,t2,t3 * */ }
若是想要同時查看鍵與值,就能夠經過每句哥哥條目(entries)查看,以免對值進行查找。可使用下面這段代碼框架:
@Test public void HashMapTest() { HashMap<String, Task> map = new HashMap<String, Task>(); Task task1 = new Task("task1", 1); Task task2 = new Task("task2", 2); Task task3 = new Task("task3", 3); map.put("t1", task1); map.put("t2", task2); map.put("t3", task3); for(Map.Entry<String, Task> entry : map.entrySet()) { String key = entry.getKey(); Task task = entry.getValue(); // 從寫了Task類的toString方法。 System.out.println("key = " + key + ", value = " + task.toString() + ";"); } /** * output: * key = t1, value = Task [name=task1, priority=1]; * key = t2, value = Task [name=task2, priority=2]; * key = t3, value = Task [name=task3, priority=3]; * */ }
若是調用迭代器的remove方法,實際上就從映射表中刪除了鍵以及對應的值。可是,不能將元素添加到視圖中。若是隻添加值是毫無心義的。若是試圖調用add方法,將會拋出UnsupportedOperationException異常。