更好的使用Java集合(四)

    集合(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異常。

相關文章
相關標籤/搜索