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区别
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章