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區別