本章目标
掌握Map接口的输出操作
掌握Map接口中key类的定义标准
Map接口输出
对于Map接口来说,其本身是不能直接使用迭代(例如:Iterator、foreach)进行输出的,因为Map中的每个位置存放的是一对值(keyàvalue),而Iterator中每次只能找到一个值。所以,如果此时非要使用迭代进行输出的话,则必须按照以下的步骤完成(以Iterator输出方法为例):
——1、将Map的实例通过entrySet()方法变为Set接口对象;
——2、通过Set接口实例为Iterator实例化;
——3、通过Iterator迭代输出,每个内容都是Map.Entry的对象;
——4、通过Map.Entry进行key —> value的分离。
Map输出方式一:Iterator输出Map
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class IteratorDemo04 {
public static void main(String[] args) {
Map<String,String> map = null;//声明 Map 对象,指定泛型类型
map = new HashMap<String, String>();//实例化 Map 对象
map.put("baidu", "www.baidu.com");//增加内容
map.put("聊程", "阅谁问君诵,水落清香浮");//增加内容
map.put("name", "chaoyi");//增加内容
Set<Map.Entry<String,String>> allSet =null;//声明一个 Set 集合,指定泛型
allSet = map.entrySet();//将 Map 接口实例变为 Set 接口实例
Iterator<Map.Entry<String,String>> iter = null;//声明 Iterator 对象
iter = allSet.iterator();//实例化 Iterator 对象
while(iter.hasNext()){
Map.Entry<String,String> me = iter.next();//找到 Map.Entry 实例
System.out.println(me.getKey()+"-->"+me.getValue());//输出 key 和 value
}
}
/* 结果:
* baidu-->www.baidu.com
* 聊程-->阅谁问君诵,水落清香浮
* name-->chaoyi
* */
}
Map输出方式二:foreach输出Map
import java.util.HashMap;
import java.util.Map;
public class ForeachDemo02 {
public static void main(String[] args) {
Map<String,String> map = null;//声明 Map 对象,指定泛型类型
map = new HashMap<String, String>();//实例化 Map 对象
map.put("baidu", "www.baidu.com");//增加内容
map.put("聊程", "阅谁问君诵,水落清香浮");//增加内容
map.put("name", "chaoyi");//增加内容
for(Map.Entry<String,String> me:map.entrySet()){
System.out.println(me.getKey()+"-->"+me.getValue());//输出 key 和 value
}
}
/* 结果:
* baidu-->www.baidu.com
* 聊程-->阅谁问君诵,水落清香浮
* name-->chaoyi
* */
}
注意事项二:直接使用非系统类作为key
如果要使用非系统类作为Map的key,则此类必须覆写Object类中的以下两个方法:
——hashCode()
——equals
import java.util.HashMap;
import java.util.Map;
class Person{//定义 Person 类
private String name;//定义 name 属性
private int age;//定义 age 属性
public Person(String name, int age) {//通过构造方法为属性赋值
this.name = name;//为 name 属性赋值
this.age = age;//为 age 属性赋值
}
public boolean equals(Object obj){//覆写 equals() 方法
if(this==obj){//判断地址是否相等
return true;//返回 true 表示同一个对象
}
if(!(obj instanceof Person)){//传递进来的不是本类的对象
return false;//返回 false 表示不同一个对象
}
Person p = (Person)obj;//进行向下转型
if(this.name.equals(p.name)&&this.name==p.name){
return true;//属性依次比较,相等返回 true
}else{
return false;//属性内容不相等,返回 false
}
}
public int hashCode(){//覆写 hashCode() 方法
return this.name.hashCode()*this.age;//计算公式
}
public String toString(){//覆写 toString() 方法
return "姓名:"+this.name+";年龄:"+this.age;//返回信息
}
}
public class HashMapDemo08 {
public static void main(String[] args) {
Map<Person,String> map = null;//实例化 Map 对象,指定泛型类型
map = new HashMap<Person, String>();//实例化 Map 对象
Person per = new Person("张三", 30);//实例化 Person 对象
map.put(per, "Zhangsan");//增加内容
System.out.println(map.get(per));//查找内容
//和 System.out.println(map.get(per).toString()); 一样
}
/* 结果:
* 取出的内容是:阅谁问君诵,水落清香浮
* */
}