关于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等系统类表示。