Map集合可以保存一对关联数据(按照“key = value”的形式)。
Map接口的常用方法
方法 | 类型 | 描述 |
---|---|---|
public V put(K key, V value) |
普通 | 向集合中保存数据 |
public V get(Object key) |
普通 | 根据key查找对应的value数据 |
public Set<Map.Entry<K, V>> entrySet() |
普通 | 将Map集合转化为Set集合 |
public Set<K> keySet() |
普通 | 取出全部的key |
Map接口的两个常用子类:HashMap、Hashtable。
HashMap子类的使用
import java.util.HashMap;
import java.util.Map;
public class TestHashMap {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
//出现key重复的情况,就会使用新的数据替换已有数据。
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
map.put(null, 5);
map.put("f", null);
System.out.println(map);
}
}
//程序的执行结果为:{null=5, a=1, b=2, c=3, d=4, f=null}
上例利用HashMap实现了Map集合最基础的数据保存操作。通过此例可以看出Map如下特点:
- 使用HashMap定义的Map集合是无序存放的;
- 如果发现了重复的key会进行覆盖,使用新的内容替换旧的内容;
- 使用HashMap子类保存数据时key和value均可取null。
PS:Map与Collection的区别
Map和Collection都可以保存动态长短的数据,其本质的区别在于使用的环境。
- Collection :利用Iterator接口输出数据。
- Map:实现用过key查找value的字典功能。
HashMap与HashTable的区别:
区别点 | HashMap | HashTable |
---|---|---|
性能 | 异步处理 | 同步处理 |
数据安全 | 非线程安全 | 线程安全 |
设置null | 允许key或value内容为null | 不允许设置null |
利用Iterator输出Map集合
由此可知,Collection集合保存数据时所有对象是直接保存的,而Map集合保存数据时,所保存的key和value会自动包装成为Map.Entry接口对象。如果利用Iterator进行迭代,那么next()方法所返回的数据是一个Map.Entry接口对象,如下定义。
public static interface Map.Entry<K, V>{}
该接口定义的常用方法如下:
方法 | 类型 | 描述 |
---|---|---|
public K getKey() |
普通 | 取得数据中的key |
public V getValue() |
普通 | 取得数据中的value |
public V setValue() |
普通 | 修改数据中的value |
Map接口中定义了一个方法:public Set<Map.Entry<K, V>> entrySet()
使用此方法输出Map集合的操作如下:
- 利用entrySet()方法将Map接口数据中的数据转换为Set接口实例进行保存。
- 利用Set接口中的iterator()方法将Set集合转换为Iterator接口实例。
- 利用Iterator接口进行迭代输出。
利用Iterator实现Map接口输出
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestOutput {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
// 将Map集合转换为Set集合,以使用itertor()方法,注意泛型统一
Set<Map.Entry<String, Integer>> set = map.entrySet();
//取得Iterator接口实例
Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
while (iterator.hasNext()) {
//每一次迭代取得的都是Map.Entry接口实例,以进行key和value的分离
Map.Entry<String, Integer> me = iterator.next();
System.out.println(me.getKey() + "--->>" + me.getValue());
}
}
}
自定义Map集合的key类型
作为key的自定义的类必须覆写hasCode()和equals()两个方法,以确定元素是否重复。