关于Map集合的输出说明(核心)
在Map接口里面存在一个keySet()方法,此方法返回的是所有的key的数据,并且是以Set集合的形式返回
,于是下面就使用此方法输出数据

package classJI; 

import java.util.HashMap; 

import java.util.Iterator; 

import java.util.Map; 

import java.util.Set; 

public class Mapd { 



 
 public static void main(String[] args) { 

 
 // TODO Auto-generated method stub 

 
 Map<Integer,String> map=new HashMap<Integer,String>(); 

 
 map.put(1, "张三"); 

 
 map.put(2, "李四");//key重复 

 
 map.put(3, "王五"); 

 
 Set<Integer> set=map.keySet();//取得全部的key 

 
 Iterator<Integer> iter=set.iterator(); 

 
 while(iter.hasNext()) { 

 
 Integer key=iter.next(); 

 
 System.out.println(key+"-->"+map.get(key)); 

 
 } 

 
 } 



}


就本程序而样,已经实现了Map集合的输出操作,但是这个输出操作存在以下问题:首先取得了全部key,需要
进行迭代输出,而且每一个key又要取查询集合中对应的value(循环)。所以这样的输出形式是不可取的
如果要想输出Map集合,那么一定还是需要使用到Iterator接口,可是Map接口里面并没有定义像Collection
接口之中定义的iterator()方法,那么下面就需要分析一下Collection和Map的数据保存区别


可以发现在Map接口里面存在有一个static定义的子接口:Map Entry,而所有的key和value都自动的封装
在了此接口对象之中,而在Map Entry接口里面存在有两个方法:
取得包装的key:public K getKey();
取得包装的value:public V getValue();

关于Map接口使用Iterator输出的过程
1.首先使用Map集合之中的entrySet()方法将Map集合变为Set集合,而此时Set集合中的每一个元素类型都是
Map.Entry接口实例;
2.利用Set接口的iterator()方法取得Iterator()接口对象,同时Iterator中操作的类型依然是Map.Entry;
3.利用Iterator进行迭代输出,取出每一个Map.Entry对象,并且利用getKey()和getValue()取出数据。
范例:利用Iterator输出Map集合(重点)

package classJI; 

import java.util.HashMap; 

import java.util.Iterator; 

import java.util.Map; 

import java.util.Set; 

public class Mape { 

 
 public static void main(String[] args) { 

 
 // TODO Auto-generated method stub 

 
 Map<Integer,String> map=new HashMap<Integer,String>(); 

 
 map.put(1, "张三"); 

 
 map.put(2, "李四");//key重复 

 
 map.put(3, "王五"); 

 
 Set<Map.Entry<Integer,String>> set=map.entrySet(); 

 
 Iterator<Map.Entry<Integer,String>> iter=set.iterator(); 

 
 while(iter.hasNext()) { 

 
 Map.Entry<Integer,String> me=iter.next(); 

 
 System.out.println(me.getKey()+"-->"+me.getValue()); 

 
 } 

 
 } 

}



关于Map集合之中key的说明
通过之前的代码演示发现一直都是使用Integer作为key的类型,而且Integer本身也是系统类,那么在实际
上Map也可以使用自定义类型作为key。但是此时必须有一个要求:由于Map集合根据key的查找属于对象的
匹配过程,所以自定义的key类型,类一定要重写Object类的hashCode()和equals()两个方法。

package classJI; 



import java.util.HashMap; 

import java.util.Iterator; 

import java.util.Map; 

import java.util.Set; 

class Test{ 

 
 private String name; 

 
 private int age; 

 
 public Test(String name,int age) { 

 
 this.name=name; 

 
 this.age=age; 

 
 } 

 
 @Override 

 
 public String toString() { 

 
 return "Test [name=" + name + ", age=" + age + "]"; 

 
 } 

 
 @Override 

 
 public int hashCode() { 

 
 final int prime = 31; 

 
 int result = 1; 

 
 result = prime * result + age; 

 
 result = prime * result + ((name == null) ? 0 : name.hashCode()); 

 
 return result; 

 
 } 

 
 @Override 

 
 public boolean equals(Object obj) { 

 
 if (this == obj) 

 
 return true; 

 
 if (obj == null) 

 
 return false; 

 
 if (getClass() != obj.getClass()) 

 
 return false; 

 
 Test other = (Test) obj; 

 
 if (age != other.age) 

 
 return false; 

 
 if (name == null) { 

 
 if (other.name != null) 

 
 return false; 

 
 } else if (!name.equals(other.name)) 

 
 return false; 

 
 return true; 

 
 } 

} 

public class Mapf { 

 
 public static void main(String[] args) { 

 
 // TODO Auto-generated method stub 

 
 Map<Test,String> map=new HashMap<Test,String>(); 

 
 map.put(new Test("张三",20),new String("2S")); 

 
 System.out.println(map.get(new Test("张三",20))); 

 
 } 

}


以上的代码只是再一次重复强调了hashCode()和equals()的作用,但是从实际的角度来看,作为key的
类型99%的情况下都会使用String表示,或者使用Integer等系统类表示。