(题外话:一日不见,如隔三秋But,I‘am here . Always.)
今天的这一篇是有关于java的又一个很重要的类――Map映像,那我们接下来就学习Map<K,V>接口的几个常用到的具体实现类。
一.HashMap:
(特点:key无序散列存放,key唯一)
1. 添加:put(key,value);
2. 删除:remove(key); clear();
3. 修改:put(key,value),覆盖之前key对应的value值;
4. 查找:containsKey(),containsValue();返回值是true或false
5.提取输出:也是用迭代器Iterator,但是Map中没有迭代器,那么我们可也使用Collection中的,具体 方法有三种,详见下列代码:
package map.Map; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class HashMapTest { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); //增加操作,键和值 map.put("姓名", "张非"); map.put("密码", "123"); map.put("邮箱", "[email protected]"); map.put("姓名", "李斯"); System.out.println(map);//重写了toString()方法 //修改操作,根据指定的键以新值换旧值 map.put("姓名","王剑"); System.out.println(map); //查找操作 System.out.println(map.containsKey("姓名"));//false System.out.println(map.containsValue("张非"));//true System.out.println("--------------------------"); //第一种输出方式:迭代所有的Key值,再通过get(key)方法得到value Set<String> set=map.keySet(); Iterator<String> it=set.iterator(); while(it.hasNext()){ String key=it.next(); String value=map.get(key); System.out.println(key+":"+value); } System.out.println("------------------------"); //第二中输出方式:通过Map.Entry和getKey(),getValue()方法 Set<Map.Entry<String, String>> entry=map.entrySet(); Iterator<Map.Entry<String, String>> entryIt=entry.iterator(); while(entryIt.hasNext()){ Map.Entry<String, String> me=entryIt.next(); String key=me.getKey(); String value=me.getValue(); System.out.println(key+":"+value); } System.out.println("----------------------------"); //第三种输出方式:只得到value的方法 Collection<String> col=map.values(); Iterator<String> colIt=col.iterator(); while(colIt.hasNext()){ String value=colIt.next(); System.out.println(value); } } }
运行结果:
{姓名=李斯, 密码=123, 邮箱[email protected]} {姓名=王剑, 密码=123, 邮箱[email protected]} true false -------------------------- 姓名:王剑 密码:123 邮箱:[email protected] ------------------------ 姓名:王剑 密码:123 邮箱:[email protected] ---------------------------- 王剑 123 [email protected]
二.Hashtable
关于Hashtable,我们可以去猜测是不是和HashMap的用法也基本一样呢?答案是:对的!的确,正如我们从前学过的ArrayList和Vector,还有stringBuilder和stringBuffer的区别一样,这里就不过多说,下面只强调一点Hashtable与HashMap的另外一点不同:
HashMap中的key值和value值都可以为null,而Hashtable不可以,会出现NullPointerException空指针异常
我们看一下下面简单的例子:
public class HashtableTest { public static void main(String[] args) { Map<String,String> map=new Hashtable<String,String>(); map.put("姓名", "张非"); map.put(null, null); System.out.println(map); } } 运行结果: Exception in thread "main" java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:394) at map.Map.HashtableTest.main(HashtableTest.java:15)
public class HashtableTest { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); map.put("姓名", "张非"); map.put(null, null); System.out.println(map); } } 运行结果: {null=null, 姓名=张非}
(注意一点:
HashMap中containsKey按照hashcode和equals查找,containsValue根据equals查找,很好理解,因为key值具有唯一性,类似于HashSet,而value值是不唯一的,这样就很容易理解了)
三.TreeMap
TreeMap就是一种可排序的Map,按照key值进行排序,也就要求TreeMap的key值是具有可比较性的 (关于这一点,可以根据TreeSet来辅助理解)
当然,当key值不具有比较性时,会出现异常
下面分别给出key值是否有比较性的情况为例子:
package map.Map; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; /* * TreeMap的自动按key值排序功能 */ public class TreeMapTest { public static void main(String[] args) { Map<String,User> map=new TreeMap<String,User>(); //创建三个用户 User user1=new User("张菲"); User user2=new User("赵敏"); User user3=new User("王剑"); //添加key和value的值 map.put("b", user1); map.put("c", user2); map.put("a", user3); //提取输出显示 Set<String> set=map.keySet(); Iterator<String> it=set.iterator(); while(it.hasNext()){ String key=it.next(); User value=map.get(key); System.out.println(key+":"+value); } } } 运行结果: a:User王剑 b:User张菲 c:User赵敏
从结果我们可以看出:作为key值得"a","b","c"是按照String的compareTo方法排序之后的结果
上面的例子是以String类型作为key值得,下面我们用User类型作为key值测试一下:
public class TreeMapTest { public static void main(String[] args) { Map<User,String> map=new TreeMap<User,String>(); //创建三个用户 User user1=new User("张菲"); User user2=new User("赵敏"); User user3=new User("王剑"); //添加key和value的值 map.put(user1,"b"); map.put(user2,"c"); map.put(user3,"a"); System.out.println(map); } } 运行结果: Exception in thread "main" java.lang.ClassCastException: map.Map.User cannot be cast to java.lang.Comparable at java.util.TreeMap.put(TreeMap.java:542) at map.Map.TreeMapTest.main(TreeMapTest.java:19)
可以看出:出现了ClassCastException类型转换异常,则一般情况下用应该使用八种封装类或String作key值,这一点是值得注意的地方。
当目前为止,我们已经把java中有关集合和映像的相关知识大致介绍完了,下面是整个体系关系图,有助于我们的理解,一起看一看吧