Java集合框架————Map集合(3) Map集合使用Iterator輸出(重點); 關於Map中key的說明; TreeMap子類;

Map集合使用Iterator輸出

Map接口與Collection接口不同,Collection接口有iterator()方法可以很方便的取得Iterator對象來輸出,而Map接口本身並沒有此方法。下面我們首先來觀察Collection接口與Map接口數據保存的區別:

在這裏插入圖片描述

在Map接口裏面有一個重要的方法,將Map集合轉爲Set集合:

public Set<Map.Entry<K, V>> entrySet();

Map要想調用Iterator接口輸出,走的是一個間接使用的模式,如下圖:

在這裏插入圖片描述

範例:通過Iterator輸出Map集合

public class Map_iterator {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"hello");
        map.put(2,"I'm");
        map.put(3,"fish");
        //將map集合轉爲set集合
        Set<Map.Entry<Integer,String>> set = map.entrySet();
        //獲取Iterator對象
        Iterator<Map.Entry<Integer, String>> iterator = set.iterator();
        while (iterator.hasNext()){
            //取出每一個Map.Entry對象
            Map.Entry<Integer,String> entry = iterator.next();
            //取得key和value的值
            System.out.println(entry.getKey()+ " = " + entry.getValue());
        }
    }
}

關於Map中key的說明

在之前使用Map集合的時候使用的都是系統類作爲key(Integer,String等)。實際上用戶也可採用自定義類作爲key。這個時候一定要記得覆寫Object類的hashCode()與equals()方法。

範例:覆寫hashCode()與equals()方法

class Person{
    private Integer age;
    private String name;

    public Person(Integer age, String 張三) {
        this.age = age;
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return Objects.equals(age, person.age) &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(age, name);
    }


    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class Map_key {
    public static void main(String[] args) {
        Map<Person,String> map = new HashMap<>();
        map.put(new Person(15,"張三"),"張san");
        System.out.println(map.get(new Person(15,"張三")));
    }
}

實際開發來講,我們一般都是採用系統類(String,Integer等)作爲Key值,這些系統類都幫助用戶覆寫好了hashCode()與equals()方法。

TreeMap子類

TreeMap是一個可以排序的Map子類,它是按照Key的內容排序的。

範例:觀察TreeMap的使用。

public class TestDemo {
    public static void main(String[] args) {
        Map<Integer,String> map = new TreeMap<>() ;
        map.put(2,"C") ;
        map.put(0,"A") ;
        map.put(1,"B") ;
        System.out.println(map);
    }
}

這個時候的排序處理依然按照的是Comparable接口完成的。

結論:有Comparable出現的地方,判斷數據就依靠compareTo()方法完成,不再需要equals()與hashCode()

Map集合小結:

  1. Collection保存數據的目的一般用於輸出(Iterator),Map保存數據的目的是爲了根據key查找,找不到返
    回null。
  2. Map使用Iterator輸出(Map.Entry的作用)
  3. HashMap數據結構一定要理解(鏈表與紅黑樹)、HashMap與Hashtable區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章