---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------
Map集合的特点
l Map与Collection在集合框架中属并列存在
l Map存储的是键值对
l Map存储元素使用put方法,Collection使用 add方法
l Map集合没有直接取出元素的方法,而是 先转成Set集合,在通过迭代获取元素
l Map集合中键要保证唯一性
KeySet的取值方式
/*
* map集合的两种取出方式
* 1.KeySet: 将Map中所有的键存入到Set集合,因为Set具备迭代器。
* 所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值。
*
* Map集合的取出原理,将Map集合转成set集合,再通过迭代器取出。
*
*/
import java.util.*;
public class _02_Map_KeySet {
public static void main(String[]args)
{
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(02,"zhangsan02");
map.put(04,"zhangsan04");
map.put(01,"zhangsan01");
map.put(03,"zhangsan03");
//先获取Map集合中所有键的Set集合。KeySet();
Set<Integer> keySet = map.keySet();
//有了Set集合,就可以获取其迭代器
Iterator<Integer> it = keySet.iterator();
while(it.hasNext())
{
Integer key = it.next();
//有了键,可以通过Map集合的get方法获取其对应的值。
String value = map.get(key);
System.out.println("key:"+key+"value:"+value);
}
}
}
Entryset
* 2,entrySet: 返回的是Set<Map.Entry<K,V>>
* |--entrySet:将集合中的映射关系(映射关系相当于丈夫和妻子的结婚证)
* 存入到了Set集合中,而这个关系的数据类型就是Map.Entry
*
*
* |--Map.Entry:其实Entry也是一个接口,它是Map接口中的内部接口(代码如下示)
*
interface Map
{
public static interface Entry
{
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map
{
class Hash implements Map.Entry
{
public Object getKey(){}
public Object getValue(){}
}
}
import java.util.*;
public class _03_Map_entrySet {
public static void main(String[]args)
{
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(02,"lisi2");
map.put(03,"lisi3");
map.put(01,"lisi1");
map.put(04,"lisi4");
Set<Map.Entry<Integer,String>> entry = map.entrySet();
Iterator<Map.Entry<Integer,String>> it = entry.iterator();
while(it.hasNext())
{
Map.Entry<Integer,String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println("key:"+key+",value:"+value);
}
/*
//将Map集合中的映射关系,存入到Set集合中
//Set集合接收的是 《返回的映射关系Map.Entry<包含的数据类型K(丈夫),V(妻子)>》
Set<Map.Entry<Integer,String>> entry = map.entrySet();
//调用Set集合的迭代器
Iterator<Map.Entry<Integer,String>> it = entry.iterator();
while(it.hasNext())
{
//获取输出的映射关系 it.next()返回的是映射关系(K,V);
Map.Entry<Integer,String> me = it.next();
//定义数据类型接收获取的键值
Integer Key = me.getKey();
//定义数据类型接收获取的数据
String value = me.getValue();
System.out.println("key:"+Key+",value:"+value);
}
*/
}
}
Map集合常用类
l Hashtable:线程安全,速度慢,不允许存放 null键,null值,已被HashMap替代。
l HashMap:线程不安全,速度快,允许存放null 键,null值。
l TreeMap:对键进行排序,排序原理与TreeSet 相同。
经典小练习
TreeMap练习,字母出现的次数
/*
* 练习:
* “sdfgzxcvasdfxcvdf”获取该字符串中的字母出现的次数。
*
* 希望打印结果a(1)c(2)..
*
* 通过结果发现,每一个字母都有对应的次数,说明字母和次数之间都有映射关系。
*
* 注意了:当发现有映射关系时,可以选择map集合。
* 因为map集合中存放就是映射关系。
* ---------------------------------------------
* 什么时候使用Map集合呢?
* 当数据之间存在着映射关系时,就要先想到Map集合。
* ---------------------------------------------
* 思路:
* 1,将字符串转换成字符数组。因为要对每一个字母进行操作。
* 2,定义一个Map集合,因为打印的字母有顺序,所以使用TreeMap集合。
* 3,遍历字符数组。
* 将每一个字母作为键去查Map集合。
* 如果返回null,将该字母和1存入到Map集合中 。
* 如果返回不是null,说明该字母在Map集合中已经存在,并有对应的次数。
* 那么就获取该次数,并进行自增,然后将该字母和自增后的次数存入到Map集合中,
* 覆盖掉原来键所对应的值
*
* 4,将Map集合中的数据变成指定的字符串形式返回。
*/
import java.util.*;
public class _06_TreeMap练习_字母出现的次数 {
public static void main(String[]args)
{
String s = charCount("aab,ca.bd+fef-a");
System.out.println(s);
}
public static String charCount(String str)
{
//接收char数组
char[] chs = str.toCharArray();
//注意泛型接收的是引用数据类型,不能直接写char,int基本数据类型
//所以要去找它们对应的数据包装类型。
//使用TreeMap集合进行排序
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
//进行遍厉
int count = 0;
for(int x=0;x<chs.length;x++)
{
if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))//不是字母之间
{
continue;
}
Integer value = tm.get(chs[x]); //通过chs[x]键,获取值
if(value!=null)
{
count = value;
}
count++;
tm.put(chs[x], count);
count=0;//用完一次后,进行清0;
/*
if(value==null)
{
tm.put(chs[x],1);
}
else
{
value = value+1;
tm.put(chs[x],value);
}
*/
}
//打印集合
//System.out.println(tm);
//使用缓冲容器StringBuilder存储遍历对象
StringBuilder sb = new StringBuilder();
Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Character,Integer> me = it.next();//接收映射
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
}