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

Java集合框架(四)之Map详解

2012-11-19 21:39 274 查看
-------android培训、java培训、期待与您交流! ----------

Map(映射)是一个接口,是一个键值对来进行存储的。一对一对往里内存,而且要保证键的唯一性。

Map

|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0效率低

|--HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。

jdk1.2效率高

|--TreeMap:底层是而查实数据结构。线程不同步。可以用于给Map集合中的键进行排序,和Set很像,其实,Set底层就是使用了Map集合。

Map

HashMap是最常用的一个类,那么HashMap的最常用的方法有哪些呢?

a) 放置:publicVput(K
key, V value):在此映射中关联指定值与指定键

b)获取:public V get(Object key):返回指定键所映射的值


键的集合:publicSet<K>keySet():Map的keySet()方法会返回key的集合,因为Map的键是不能重复的,因此ksySet()方法的返回类型是set。

c) 值的集合:publicCollection<V>
values():Map的值是可以重复的。因此value()方法的返回类型是Collection,可以容纳重复的元素.

我们来看看以下,这些常用方法的使用:

import java.util.Collection;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Set;

publicclassHashMapTest
{

publicstaticvoid
main(String[] args) {

HashMapmap=newHashMap();

map.put("name1","zhangsan");

map.put("name2","lisi");

map.put("name3","wangwu");

map.put("name1","zhaoliu");

System.out.println(map);

System.out.println("--------------------");

Stringvalue1=(String) map.get("name2");

System.out.println(value1);

Stringvalue2=(String) map.get("name4");

System.out.println(value2);//打印一个空

Setset=map.keySet();

for(Iteratorit=set.iterator();it.hasNext();){ //遍历Map中key的值

Objectkey=it.next();

System.out.println(key);

}

Collectionc=map.values();

System.out.println(c);

}

}

总结:keySet()方法和values()方法,经常用来遍历map中的key和value值

小练习:我们在命令行输入几个字符,有重复的,请使用map来记录字符出现的次数。

import
java.util.HashMap;

import java.util.Iterator;

import java.util.Set;

publicclassMapTest
{

publicstaticvoid
main(String[] args) {

HashMapmap =newHashMap();

for
(int i = 0; i < args.length;
i++) {

if
(map.get(args[i]) ==null) { //如果map中key没有值,则直接放进去

map.put(args[i],1);

}else{

Integerin=(Integer)map.get(args[i]);
//现将map中的值取出来

in++; //再自增1

map.put(args[i],in);

}

}

Setset=map.keySet(); //使用keySet将key放到Set集合里

for(Iteratorit=set.iterator();it.hasNext();){

Stringkey=(String) it.next();

Integervalue=(Integer) map.get(key);

System.out.println(key+":"+value);

}

}

}

两种遍历Map

现在我们来看看如何遍历HashMap,遍历HashMap总共有两种方法:

第一种:使用keySet()方法和values()方法,前面一代码已演示过了

第二种,我们就要涉及到Map接口中的内部接口Map.Entry<K,V>,我们要使用以下三种方法

a) Map映射视图:Set<Map.Entry<K,V>>entrySet():返回此映射中包含的映射关系的
Set 视图

b) 获取key的集合:K
getKey():返回与此项对应的键。来自于Map.Entry接口的方法

c) 获取value的集合:V
getValue():返回与此项对应的值,来自于Map.Entry接口的方法

现在我们来看看第二种遍历是如何实现的呢?

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

publicclassMapEntryTest
{

publicstaticvoidmain(String[]
args) {

HashMapmap=newHashMap();

map.put("a","dog");

map.put("b","pig");

map.put("c","flog");

map.put("d","cow");

Setset=map.entrySet();

for(Iteratorit=set.iterator();it.hasNext();){ //遍历Map<k,v>视图

Map.Entryentry=(Entry) it.next(); //返回给Map.Entry

Stringkey=(String) entry.getKey();

Stringvalue=(String) entry.getValue();

System.out.println(key+":"+value);

}

}

}

总结:map集合的取出原理:将map集合转成set集合,再通过迭代器取出。

map集合的两种取出(遍历)方式:

1. Set<K> keySet:将Map中所有的键存入到Set集合。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值.

2. Set<Map.Entry<k,y.>>entrySet:将集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry

Map扩展

我们什么时候使用集合呢?当数据之间存在着映射关系时,就要现象map集合。

练习:获取一段字符串中的字母出现的次数。

import java.util.*;

class Test1

{

publicstatic void main(String[] args)

{

Stringstr=setValueCount("slkfsklda,shjahgd.sfsa");

sop(str);

}

publicstatic String setValueCount(String str){

char[]c=str.toCharArray();

TreeMap<Character,Integer>map=new TreeMap<Character,Integer>();

intcount=0;

for(inti=0;i<c.length;i++){

if(!(c[i]>='a'&&c[i]<='z'||c[i]>='A'&&c[i]<='Z'))//判断是否在a-z或者A-Z之间。

continue;

/*第一种*/

Integernum=map.get(c[i]);

if(num!=null){

count=num;

}

count++;

map.put(c[i],count);

count=0;

/*

第二种

if(num==null){

map.put(c[i],1);

}else{

num=num+1;

map.put(c[i],num);

}

*/

}

StringBuildersb=new StringBuilder();

Set<Map.Entry<Character,Integer>> entry=map.entrySet();

for(Iterator<Map.Entry<Character,Integer>>it=entry.iterator();it.hasNext();){

Map.Entry<Character,Integer>me=it.next();

sb.append(me.getKey()+"("+me.getValue()+")");

}

returnsb.toString();

}

publicstatic void sop(Object obj){

System.out.println(obj);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: