(题外话:一日不见,如隔三秋But,I‘am here . Always.) java
今天的这一篇是有关于java的又一个很重要的类——Map映像,那咱们接下来就学习Map<K,V>接口的几个经常使用到的具体实现类。ide
一.HashMap:学习
(特色:key无序散列存放,key惟一)测试
1. 添加:put(key,value);
2. 删除:remove(key); clear();
3. 修改:put(key,value),覆盖以前key对应的value值;
4. 查找:containsKey(),containsValue();返回值是true或falsecode
5.提取输出:也是用迭代器Iterator,可是Map中没有迭代器,那么咱们可也使用Collection中的,具体 方法有三种,详见下列代码:blog
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("邮箱", "hh@163.com"); 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, 邮箱=hh@163.com} {姓名=王剑, 密码=123, 邮箱=hh@163.com} true false -------------------------- 姓名:王剑 密码:123 邮箱:hh@163.com ------------------------ 姓名:王剑 密码:123 邮箱:hh@163.com ---------------------------- 王剑 123 hh@163.com
二.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中有关集合和映像的相关知识大体介绍完了,下面是整个体系关系图,有助于咱们的理解,一块儿看一看吧