1.Map集合
一次添加一对元素,称为双列集合,Collection一次存储一个元素,称为单列集合。
其实Map集合中存储的是键值对,Map集合必须保证键的唯一性。
2.Map集合常用的方法:
1.添加:
value put(key,value);返回前一个和key关联的值,如果没有就返回null.
2.删除:
void clear();清空map集合
value remove();根据指定的key删除这个键值对,并返回值。
3.判断:
boolean containsKey(key);
boolean containsValue(value);
boolean isEmpty();
4.获取;
value get(key);
通过键拿值,如果没有该键就返回null;可以通过返回null,来判断是否包含指定键。
int size();获取键值对的个数。
3.Map集合如何取出元素。
在Map集合中是没有迭代器的,所以它要取出元素,必须经过一系列的转化。
这里有三种方式:
1.Collection<V> values();返回此映射中包含的值得Collection视图。
2.Set<V> KeySet();返回此映射中包含键的Set视图。
3.Set<Map.Entry<K,V>> entrySet();返回此映射中包含的映射关系的Set视图。
public static void main(String[] args){
Map<Integer,String> map = new HashMap<>();
method1(map);
method2(map);
method3(map);
}
(1).Collection values();方式
public static void method1(Map<Integer, String> map) {
map.put(8,"WangWu");
map.put(2,"Zhaoliu");
map.put(7,"XiaoQiang");
map.put(6,"WangCai");
Collection<String> values = map.values();
for(Iterator<String> it = values.iterator();it.hasnext;){
System.out.println(it.next());
}
}
(2)
/*
Set<Map.Entry<K,V>> entrySet();
原理:该方法将键和值的映射关系作为对象存储到Set集合中,而这个映射关系的类型就是Map.Entry类型。
*/
public static void method2(Map<Integer, String> map) {
map.put(8,"WangWu");
map.put(2,"Zhaoliu");
map.put(7,"XiaoQiang");
map.put(6,"WangCai");
Set<Map.Entry<Integer,String>> keySet = map.entrySet();
for(Iterator<Map.Entry<Integer,String>> it = keySet.iterator();it.hasnext;){
Map.Entry<Integer,String> me = it.next();
Integer key = me.getKey();
String value = me.getValue(key);
System.out.println(key+":"+value);
}
}
(3)
/*
Set<V> KeySet();
原理:通过keySet方式获取map中所有的键所在的set集合,
再通过Set的迭代器获取到每一个键,再对每一个键获取对应的值即可。
*/
public static void method2(Map<Integer, String> map) {
map.put(8,"WangWu");
map.put(2,"Zhaoliu");
map.put(7,"XiaoQiang");
map.put(6,"WangCai");
Set<Integer> keySet = map.keySet();
for(Iterator<Integer> it = keySet.iterator();it.hasnext;){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);
}
}
4 Map常用的子类:
HashTable:内部数据结构是哈希表是同步的,不允许null作为键,null作为值。
Properties:用来存储键和值对型的配置文件的信息,可以与IO技术相结合。
HashMap:内部数据结构是哈希表,不同步。不允许null作为键,null作为值。
LinkedHashMap:内部数据结构是链表和哈希表,可以实现存取一致(顺序)。
TreeMap:内部数据结构是二叉树,不同步。可以对集合中的键进行排序。
5.MapTest
/*
* 练习
* "fdgavcbsacdfs"获取该字符串中,每一个字母出现的次数。
* 要求打印结果为:a(2)b(1)...
* 思路;
* 1.首先 因为操作的是字符串中的字母,所以将字符串转换为字符数组。
* 2.然后观察到字母和该字母出现的次数存在一一对应的关系。这里可以想到用Map或者数组。但是出现的次数是无序的,所以要使用Map集合。
* 又因为打印结果是按照一定顺序的,所以想到TreeMap集合,字母作为键,出现的次数作为值。
* 3.把字符数组中的每个元素取出查Map表,如果该键没有在表中,则把该键和对应的值(1)存入。如果该键存在,那么将该键对应的值取出自增1后,
* 再存入Map表中。
* 4.当字符数组遍历完成后,Map表中就存储了全部字母出现的次数。
* 5.然后把Map表按照特定的方式转成字符串输出。
*
*
*/
public static void main(String[] args){
String str = "fdg3//avi249cccb++sac565dfs";
str = getCharCount(str);
System.out.println(str);
}
public static String getCharCount(String str) {
//将字符串转为字符数组。
char[] chs = str.toCharArray();
//创建Map表
TreeMap<Character,Integer> map = new TreeMap<>();
//取出元素进行查表
for (int i = 0; i < chs.length; i++) {
if (!(chs[i] >= 'a' && chs[i] <= 'z')||(chs[i] >= 'A' && chs[i] <= 'Z')) {
continue;
}
Integer value = map.get(chs[i]);
if ( value == null){
//表中没有该元素,直接插入。
map.put(chs[i],1);
}else{
//表中存在该元素,把value取出+1然后在进行存入
map.put(chs[i],++value);
}
}
//把map表转为特定的字符串
String st = getMapSring(map);
return st;
}
private static String getMapSring(TreeMap<Character, Integer> map) {
StringBuilder sb = new StringBuilder();
//遍历map表
/*for (Iterator<Map.Entry<Character,Integer>> it = map.entrySet().iterator();it.hasNext();){
Map.Entry<Character,Integer> me = it.next();
Character key = me.getKey();
Integer value = me.getValue();
sb.append(key+"("+value+") ");
}*/
//遍历map表foreach
for (Map.Entry<Character,Integer> me:map.entrySet()) {
Character key = me.getKey();
Integer value = me.getValue();
sb.append(key+"("+value+") ");
}
return sb.toString();
}