Map概述
Map实现类:HashMap(默认)、TreeMap、Hashtable、Properties、LinkedHashMap。
理解Map是什么
Set是单列表的表格。
List是两列的表格,其中一列是下标,另一列是元素。
Map是两列的表格,其中一列是key,另一列是value。
可以把List当成双列集合,其中一列为下标,另一列为元素。但下标不是由用户定义的,而是由List自动编号的。
可以把Map当成可以自定义下标的List,是真正的双列集合。其中key为自定义的下标,而value是元素。
因为List下标自动生成,所以一次添加一个元素。也就是相当于单列了!
因为Map需要自定义“下标”,所一次添加两个元素。
2 Map的特性
Map是双列集合;
Map一次存储一对元素,其中一个是键,一个是值,键值有对应关系;
Map中需要保证键是唯一的。key就是下标,下标当然要唯一了!
3 Map和Collection比较
Collection是单列集合,Map是双列集合;
Collection一次添加一个元素,Map一次添加两个元素。
4 Map和Entry
Map内部其实是多个Entry。
一个Entry中有两个属性:key和value。
Entry就是键值对对象。
Map中一大堆的Entry,每个Entry中包含一个key和一个value。
Map中包含一大堆的key,每个key对应一个value。
Map功能介绍
测试put()、putAll()和toString()方法
V put(K key, V value) -- 添加一个键值对到当前映射中。
void putAll(Map map) -- 添加一个map到当前map中。
String toString() – 把map转换成字符串。
2 测试put()不能有重复的key,但可以有重复的value
3 测试获取方法
V get(K) -- 获取指定键的值。
int size() – 获取键值对的个数。
Set<K> keySet() -- 获取所有键(遍历获取),值不能重复,所以使用Set返回值类型。
Collection<V> value() -- 获取所有值。值可以重复,所以使用Collection返回值类型。
Set<Map.Entry<K,V>> entrySet() -- 返回当前Map中所有键值对。
4 测试其它方法
boolean containsKey(Object key) -- 判断是否存在指定的键。(判断)
boolean containsValue(Object value) -- 判断是否存在指定的值。(判断)
boolean isEmpty() -- 判断是否为空映射。(判断)
void clear() --清空所有键值对。(删除)
V remove(K) -- 通过键删除一个键值对,返回值为被删除的键值对中的值。(删除)
遍历Map
1 遍历Map的键
2 遍历Map的值
3 通过键遍历Map
4 通过Entry遍历Map
HashMap
练习:HashMap<Person, String>:equals()和hashCode()
练习:TreeMap<Person, String>:Comparable或Comparator
1 HashMap特性
底层使用哈希表结构
因为使用哈希表,所有键元素类型必须重写equals()和hashCode()方法
2 HashMap没有独有方法
HashMap没有独有方法,所有方法都是从Map继承而来。
3 测试HashMap<Person,Person>
Hashtable
基本不使用!
1 Hashtable和HashMap比较
Hashtable是1.0的老版本类,是线程安全的,键和值都不能为null;
HashMap是1.2的新版本类,是线程不安全的,键和值都可以为null;
2 测试Hashtable的遍历
Properties (属性)
很有用!
1 Properties特性
1.0的老版本类
Hashtable的子类(线程安全的、底层哈希表、键值都不能为null)
有自己的映射获取方法,不建议使用父类的映射获取方法。put、get来加载键值和获取值。
可以与IO流交互(很强大的功能)
2 Properties独有方法
Object setProperty(String name, String value):代替父类的put()方法来映射值;
String getProperty(String name):代替父类的get()方法;
Enumeration<?> propertyNames():获取所有键。
Set<String> stringPropertyNames():获取所有键,返回值为Set<String>,JDK1.6新方法;
3 测试Properties的遍历
LinkedHashMap
1 LinkedHashMap的特性
HashMap的子类
没有独有方法
保证元素迭代顺序与添加顺序相同
好比LinkedHashSet与HashSet的关系
2 测试LinkedHashMap的遍历
TreeMap
1 TreeMap的特性
底层使用二叉树结构;
有序!使用键类型的自然顺序,或者TreeMap的比较器排序;
使用TreeMap要求键类型有自然顺序,或者给TreeMap提供比较器;
2 TreeMap键类型为String
3 TreeMap键类型为Person(自定义类型)
练习
1 候选人投票统计
一共三个候选人:zhangSan、liSi、wangWu
投票结果使用一个字符串表示:zhangSan liSi liSi zhangSan liSi wangWu liSi liSi liSi zhangSan。
程序统计每个名候选人的得票结果:zhangSan得3票、liSi得6票、wangWu得1票。
分析:
使用Map来完成,候选人名字为key,票数为value。
把字符串分割成字符串数组。
当获取一个名字后,判断Map是否存在这个名字为key的键值对
如果存在,那么就把value获取,然后再把value++,再把新的键值对放到Map中,这样就替换了原来的键值对;
如果不存在,那么就直接put(),票数为1。
循环遍历Map
2 明教结构图
明教<String, Map<String,String>>:
光明使者
光明左使:杨逍;
光明右使:范遥。
护教法王
紫衫龙王:黛绮丝;
白眉鹰王:殷天正;
金毛狮王:谢逊;
青翼蝠王:韦一笑。
把明教定义为一个Map。
分析:
光明左使:这是一个Map<String,String>
护教法王:这是一个Map<String,String>
明教是一个Map<String,Map>,其中key是String,而value是Map。更准确的说,明教是Map<String,Map<String,String>>类型。
list,set,map 在文本文件集合存储形式:
list,set在文本文件集合存储形式:
age
name
sex
map在文本文件集合存储形式:
zhangsan=23
lisi=24
wangwu=25