黑马程序员-Map集合
2014-06-06 17:12 黑马程序员* 阅读(189) 评论(0) 编辑 收藏 举报Map总结:tree排序,hsah保证唯一性
Map集合特点:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。
Map和Set很像,Set底层就是使用了Map集合。Map没有迭代器,要靠keySet和entrySet方法返回Set,在用迭代器。
Map
|--Hashtable:底层是哈希表数据结构,不可以存入键和值为Null.此实现是同步的。jdk1.0,效率低。------ |--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
|--HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。jdk1.2,效率高
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法
|--TreeMap:底层是二叉树数据结构,线程不同步,允许使用null值和null键。
可以用于给Map集合中的键进行排序(就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator)。
常用方法:
添加:
v put(k ,v)//注意;键相同时,put方法返回原来的键映射的值
void putAll(Map); 将Map中的所有映射关系存入,不是以集合的形式存入。
--| Map<String,String> map = new HashMap<String,String>();
Map<String,Integer> map1 = new HashMap<String,Integer>();
Map<String,String> map2 = new HashMap<String,String>();
map.putAll(map1);//报错,因为map不接受Integer类型
map.putAll(map2);
注:put方法,键相同时,后添加的键覆盖原来的键,并且返回原来的键映射的值
删除 :
void clear() 从此映射中删除所有映射关系
V(value) remove(Object ,key)如果存在一个键的映射关系,则将其从此映射中
删除对应键和值,并返回对应的值。不存在返回null
--|map.put("lisi","22");
System.out.println(map.remove("lisi"));//返回22
判断:boolean
containsKey(Object key) 如果此映射包含键的映射关系,则返回true
containsValue(value) 如果此映射值对应一个或多个键,则返回true
is Empty()如果此映射未包含键-值映射关系,则返回 true。
get(key)返回指定键所映射的值。同样可以判断
获取:
get( Object,key)返回指定键所映射的值。
Set keySet() 返回此映射中所包含的键(全部)
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的全部映射关系。
size() 获取此映射中的键-值关系数。//几对
Colection vaules()返回此映射中包含的全部值,与ketSet正好相反。注意返回值。
Map集合的两种取出方式:
Map集合取出的原理:将Map集合转成Set集合,在通过迭代器取出。
1.keyset:返回值类型:Set集合 功能:返回此映射中所包含的键(全部)
思路: 将Map中所有的键存入到Set集合中,因为Set具备迭代器。
所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值。
Set<Integer> keyset = map.keySet();
Iterator<Integer> it = keyset.iterator();
while (it.hasNext()){
Integer num = it.next();
System.out.println("ker:"+num+"..."+"value:"+map.get(num));
2.entrySet:返回值类型:Set 功能:将Map集合的映射关系存入到Set集合中。
而这个关系的数据类型就是:(Map.Entry<k,v>)
Set<Map.Entry<Integer,String>> entryset = map.entrySet();
Iterator<Map.Entry<Integer,String>> it = entryset.iterator();
while (it.hasNext()){
Map.Entry<Integer,String> ma = it.next();
Integer key = ma.getKey();
String value = ma.getValue();
System.out.println("key:"+key+" "+"value:"+value);
}
//高级for
for(Map.Entry<String, String> m:entryset){
System.out.println("..."+m);
}
Map.Entry :映射项(键-值对)
其实Entry也是一个接口。它是Map接口中一个内部接口。
Map的子类如hashMap在创建的时候用静态内部类实现了Entry.
为什么要定义在内部:1.Map集合先于它存在,它是Map内部的一部分。
2.直接访问Map,所以定义成内部。
练习1;
每一个学生都有对应的归属地 当作值,学生属性:姓名年龄当作键,
注意;姓名和年龄相同的视为同一个学生。 保证学生的唯一性。
思路:
1.描述学生
2.定义map容器,将学生做为键,归属地做为值,存入。
3.获取map集合的元素。
4.因为不知道定义的对象要放在何种集合中,所以要事先compareble,覆盖hashcode和equals
练习2
需求:对学生的年龄进行升序排序。
因为数据是以键值对形式存在。
所以要使用可以排序的Map集合。TreeMap
练习4:
"dfdfegfeghhg"获取该字符串中的字母出现的次数。
希望打印结果:a(1)c(3).....
思路:通过结果发现,每一个字母都有对应的系数。
说明字母和次数之间都有映射关系
1.将字符转换成数组,因为要对每一个字符进行操作。
2.定义一个Map集合,因为打印的字母有顺序,使用TreeMap集合。
3.便利字符数组。
将每一个字母作为键去查map集合。
如果返回null,将字母和1存入map中。
如果返回不是null,说明字母在map集合已经存在并有对应的次数。
那么就获取该次数并自增,然后将字母和自增后的次数存入。
4.将map集合中的数据变成指定的字符串形式返回。
练习4:
扩展 Map扩展,
--教室1(学生.......)
学校 --教室2(学生.......)
--教室3(学生.......)