1,Map接口对象本身不能直接使用迭代进行输出的。因为map每个位置存放的是一对值。
而iterator每次只能找到一个值。如果一定要迭代输出,可以通过以下步骤。:
但是,Map接口只作为查找使用,输出操作毕竟属于少数。
package 类集; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; public class test1{ public static void main(String args[]){ Map<String,String> map = null; // 声明Map对象,其中key和value的类型为String map = 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()) ; } } };
输出结果:
mldn --> www.mldn.cn zhinangtuan --> www.zhinangtuan.net.cn mldnjava --> www.mldnjava.cn
这种输出方式最终还是以collection形式输出,只是以Map.Entry作为内容的操作类型。
Map的key和value的类型也可以用非系统类!
package 类集; import java.util.HashMap; import java.util.Map; 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 test1{ 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")) ; //getKey()方法 } };
输出结果:
姓名:张三;年龄:30
但是如果非系统类作为key的类型呢?
package 类集; import java.util.HashMap; import java.util.Map; 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 test1{ 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))) ; } };
输出结果:
null
此时只是将自定义类作为key的时候,返回结果为空。那么为什么作为value的类型时候可以呢?
对于这种匹配过程,有一个特点,即,对象要一样才可以将内容查询出来。
以上的Put和get方法里面的new Person()匿名方法得到的对象是不一样的。
实例:
package 类集; import java.util.HashMap; import java.util.Map; 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 test1{ 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)) ; } };
输出结果:
zhangsan
可是这不是解决方法的最好,因为不能 将person和per对象带着走,应该像String一样,可以使用匿名对象形式找到内容。
那么此时需要按照与Set接口中判断重复元素的形式一样,进行方法的覆写。
如果要使用非系统类作为Key,则此类必须覆写Object类的以下两个方法:
hashCode()
equals()
package 类集; import java.util.HashMap; import java.util.Map; 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){ //覆写equals() 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(){ //覆写hashCode() return this.name.hashCode() * this.age ; //自定义hashCode。 } }; public class test1{ 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))) ; } };
输出结果:
zhangsan
发现此时使用匿名对象能够取出内容。作为对象的时候,实际上是依靠hashCode()和equals()来判断对象是否相等,这一点由系统内部自动完成。
总结:Map可以使用迭代输出:
map->entrySet->Set->Iterator->Map.Entry->key和value。
非系统类作为key,则保证一定要覆写equals()和hashCode()方法,否则无效。