Java类集 _Map 接口的使用注意事项

来源:互联网 发布:礼品券 网络兑换 编辑:程序博客网 时间:2024/06/05 20:58

1、掌握Map 接口的输出操作

2、掌握Map 接口中key 类的定义标准


但是,在操作前必须说明的:Map 接口一般只作为查找使用,输出的操作毕竟属于少数。

import java.util.HashMap ;import java.util.Map ;import java.util.Set ;import java.util.Iterator ;public class IteratorDemo04{public static void main(String args[]){Map<String,String> map = null; // 声明Map对象,其中key和value的类型为Stringmap = new HashMap<String,String>() ;map.put("mldn","www.mldn.cn") ;// 增加内容map.put("zhinangtuan","www.zhinangtuan.net.cn") ;// 增加内容map.put("mldnjava","www.mldnjava.cn") ;// 增加内容Set<Map.Entry<String,String>> allSet = null ;allSet = map.entrySet() ;Iterator<Map.Entry<String,String>> iter = null ;iter = allSet.iterator() ;while(iter.hasNext()){Map.Entry<String,String> me = iter.next() ;System.out.println(me.getKey() + " --> " + me.getValue()) ;}}};
第一种方式,使用Iterator 完成。当然,在JDK1.5 之后也可以使用 foreah 完成。
import java.util.HashMap ;import java.util.Map ;import java.util.Set ;import java.util.Iterator ;public class ForeachDemo02{public static void main(String args[]){Map<String,String> map = null; // 声明Map对象,其中key和value的类型为Stringmap = new HashMap<String,String>() ;map.put("mldn","www.mldn.cn") ;// 增加内容map.put("zhinangtuan","www.zhinangtuan.net.cn") ;// 增加内容map.put("mldnjava","www.mldnjava.cn") ;// 增加内容for(Map.Entry<String,String> me:map.entrySet()){System.out.println(me.getKey() + " --> " + me.getValue()) ;}}};
这两种输出形式最终实际上还是以 Collection 的形式输出,只是以Map.Entry作为内容的操作类型。
在Map 中,可以使用任意的类型作为 key 和 value  ,那么使用非系统类也可以。

import java.util.Map ;import java.util.HashMap ;class Person{private String name ;private int age ;public Person(String name,int age){this.name = name ;this.age = age ;}public String toString(){return "姓名:" + this.name + ";年龄:" + this.age ;}};public class HashMapDemo05{public static void main(String args[]){Map<String,Person> map = null ;map = new HashMap<String,Person>() ;map.put("zhangsan",new Person("张三",30));// 增加内容System.out.println(map.get("zhangsan")) ;}};
如果现在以String 为key 是可以取出内容的。

import java.util.Map ;import java.util.HashMap ;class Person{private String name ;private int age ;public Person(String name,int age){this.name = name ;this.age = age ;}public String toString(){return "姓名:" + this.name + ";年龄:" + this.age ;}};public class HashMapDemo06{public static void main(String args[]){Map<Person,String> map = null ;map = new HashMap<Person,String>() ;map.put(new Person("张三",30),"zhangsan");// 增加内容System.out.println(map.get(new Person("张三",30))) ;}};
此时,只是将自定义的类作为 key ,但是在取值的时候发现取不了了,返回的结果是null。那么这为什么之前的String 可以,但是自定义的类不存在呢?

实际上,对于匹配过程来讲呢,有一个特点,即:对象要一样才可以将内容查询出来。

import java.util.Map ;import java.util.HashMap ;class Person{private String name ;private int age ;public Person(String name,int age){this.name = name ;this.age = age ;}public String toString(){return "姓名:" + this.name + ";年龄:" + this.age ;}};public class HashMapDemo07{public static void main(String args[]){Map<Person,String> map = null ;map = new HashMap<Person,String>() ;Person per = new Person("张三",30) ;map.put(per,"zhangsan");// 增加内容System.out.println(map.get(per)) ;}};
可是这样并不是解决问题的方法,因为不可能将 Person 的 per 对象带着走啊,应该像 String 一样,可以使用匿名对象的形式找到内容。那么此时,实际上就需要按照与Set 接口中判断重复元素的方式一样,进行方法的覆写。

import java.util.Map ;import java.util.HashMap ;class Person{private String name ;private int age ;public Person(String name,int age){this.name = name ;this.age = age ;}public String toString(){return "姓名:" + this.name + ";年龄:" + this.age ;}public boolean equals(Object obj){if(this==obj){return true ;}if(!(obj instanceof Person)){return false ;}Person p = (Person)obj ;if(this.name.equals(p.name)&&this.age==p.age){return true ;}else{return false ;}}public int hashCode(){return this.name.hashCode() * this.age ;}};public class HashMapDemo08{public static void main(String args[]){Map<Person,String> map = null ;map = new HashMap<Person,String>() ;map.put(new Person("张三",30),"zhangsan");// 增加内容System.out.println(map.get(new Person("张三",30))) ;}};
作为 key ,或者更准确的说是作为对象的时候,实际上是依靠 hashCode() 和 equals() 来判断两个匿名对象是否相等,这一点由系统内部自动完成。


总结:

1、Map 可以使用迭代输出

map --> entrySet --> set -->Iterator --> Map.Entry --> key 和  value

2、如果使用非系统作为key,则一定保证覆写 equals 和 hashCode() 方法。否则无效。


原创粉丝点击