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集合。
a) 放置:publicVput(K
key, V value):在此映射中关联指定值与指定键
键的集合: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);
}
}
}
第一种:使用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
练习:获取一段字符串中的字母出现的次数。
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);
}
}
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);
}
}
相关文章推荐
- java集合框架——详解List、Set、Map
- STL中map用法详解
- JavaSE第四十八讲:Map深入详解及遍历Map的两种实现手段
- Google Map API使用详解(八)——Google Map坐标系统总结(上)
- Spark API 详解/大白话解释 之 map、mapPartitions、mapValues、mapWith、flatMap、flatMapWith、flatMapValues
- Spark API 详解/大白话解释 之 map、mapPartitions、mapValues、mapWith、flatMap、flatMapWith、flatMapValues
- 【Java】Java集合框架源码和数据结构简要分析——Set和Map
- STL中map用法详解
- c++中map的用法详解
- 第三部分、海量数据处理之 Bti-map 详解
- C++中的map详解
- STL中map用法详解
- STL:map/multimap用法详解
- C++模版STL中 map 和 string, vector 的用法详解!
- jQuery数组($.each,$.grep,$.map,$.merge,$.inArray,$.unique,$.makeArray)处理函数详解
- Java集合框架(二)之Set详解
- java的Collection和Map详解
- Spark RDD API详解(一) Map和Reduce
- STL中map用法详解
- java集合框架【3】 java1.5新特性 ConcurrentHashMap、Collections.synchronizedMap、Hashtable讨论