您的位置:首页 > 编程语言 > Java开发

Java中的Map (HashMap,Hashtable,TreeMap以及java集合类小结)

2013-07-27 09:56 537 查看
(题外话:一日不见,如隔三秋

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("邮箱", "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中有关集合和映像的相关知识大致介绍完了,下面是整个体系关系图,有助于我们的理解,一起看一看吧







本文出自 “MySpace” 博客,请务必保留此出处http://wangzhaoli.blog.51cto.com/7607113/1258494
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐