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集合小结:
- Collection保存数据的目的一般用于输出(Iterator),Map保存数据的目的是为了根据key查找,找不到返
回null。 - Map使用Iterator输出(Map.Entry的作用)
- HashMap数据结构一定要理解(链表与红黑树)、HashMap与Hashtable区别