4.1Map接口
概述
- Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value,称为entry
- Map 中的 key 和 value 都可以是任何引用类型的数据
- Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法
- 常用String类作为Map的”键”
- key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value
常用方法
### 添加、删除操作方法
Object put(Object key, Object value) 添加、或更新一个元素到HashMap中
Object remove(Object key) 删除指定key的元素
void putAll(Map t) 把Map t中所有元素添加到当前Map中
void clear() 清除当前map中所有元素
### 元素查询操作方法
Object get(Object key) 获取指定key的元素,若key不存在则返回null
boolean containsKey(Object key) 当前map所有的key中是否包含指定key,是返回true,否则false
boolean containsValue(Object value) 当前map所有的value中是否包含指定的value,是返回true,否则false
int size() 返回map元素个数
boolean isEmpty() 当前map是否为空,是返回true,否则false
boolean equals(Object obj) 当前map与指定的obj map是否相等,即所有entry相等
### 元视图操作方法
Set keySet() 获取当前map所有的key,值为Set
Collection values() 获取当前map所有的value,值为Collection
Set entrySet() 获取当前map所有的entry,值为Set
特点
- Map的key、value都可以为null
- key、entry使用Set存储,不可重复,value使用Collection存储,可以重复
- put()添加元素到map时,如果前面已经存在一个相同的key,那么新的key对应的value将覆盖旧的value
- Map接口的常用实现类:HashMap、LinkedHashMap、TreeMap、Properties
重要Map遍历
1)遍历entry(常用)
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "http://c.biancheng.net/java/");
map.put("C语言入门教程", "http://c.biancheng.net/c/");
for (Map.Entry<String, String> entry : map.entrySet()) {
String mapKey = entry.getKey();
String mapValue = entry.getValue();
System.out.println(mapKey + ":" + mapValue);
}
2)遍历key或value
Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "http://c.biancheng.net/java/");
map.put("C语言入门教程", "http://c.biancheng.net/c/");
// 打印键集合
for (String key : map.keySet()) {
System.out.println(key);
}
// 打印值集合
for (String value : map.values()) {
System.out.println(value);
}
3)迭代器遍历
Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "http://c.biancheng.net/java/");
map.put("C语言入门教程", "http://c.biancheng.net/c/");
Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + ":" + value);
}
4)键找值遍历
效率比较低,因为本身从键取值是耗时的操作
for(String key : map.keySet()){
String value = map.get(key);
System.out.println(key+":"+value);
4.2 HashMap
特点
- entry顺序存储顺序与key的hash值有关,与put添加的顺序无关
- HashMap是 Map 接口使用频率最高的实现类
- 允许使用null键和null值,与HashSet一样,不保证映射的顺序
- HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等
- HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true
Map创建对象时指定初始值
// 其他类型的Map类也类似
HashMap hmap = new HashMap() {
{ // 匿名内部类
put("type", "支出");
put("price", price);
put("item", item);
}
};
注意: 慎用, 非静态内部类/ 匿名内部类包含了外围实例的引用, 如果拥有比外部类更长的生命周期,有内存泄露隐患
4.3 LinkedHashMap
- LinkedHashMap 是 HashMap 的子类
- 与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序(使用链表):迭代顺序与 Key-Value 对的插入顺序一致
示例
4.4 TreeMap
- TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态
- TreeMap 的 Key 的排序:自然排序、定制排序
- 自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口并重写int compareTo(Object obj)方法,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
- 定制排序:创建 TreeMap 时,传入一个 Comparator 对象,要求重写Comparator接口中的int compare(Object o1, Object o2),该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口
- 使用自定义类作为TreeMap的key,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0
- 若使用自定义类作为TreeMap的key,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0
4.5 其它实现类
Hashtable
- Hashtable是个古老的 Map 实现类,线程安全。
- 与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value
- 与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序
- Hashtable判断两个key相等、两个value相等的标准,与hashMap一致
Properties
- Properties 类是 Hashtable 的子类,该对象用于处理属性文件
- 由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型
- 存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法