一.概述
Map集合没有继承Collection接口,它提供的是key到value的映射.Map中不能包含相同的key,一个key只能映射一个value.
Map集合产生一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象再映射中的存储位置.
Map集合包括Map接口以及Map接口的所有实现类
二.Map接口
常用方法:
方法 功能描述
put(K key,V value) 向集合中添加key与value的映射关系
containsKey(Object key) 如果此映射中包含key的映射关系返回true
containsValue(Object value) 如果此映射将一个或多个key映射到指定值就返回true
get(Object key) 如果存在指定的key对象,返回该对象对应的值,否则返回null
keySet() 返回该集合中所有key对象形成的Set集合
values() 返回该集合中所有值对象形成的Collection集合
举个栗子:
Map
map = new HashMap<>();
map.put("1", "first");
map.put("2", "second");
Set
set = map.keySet();//构建Map集合中所有key对象的集合
Iterator
it = set.iterator();//创建集合迭代器
System.out.println("key集合中的元素为:");
while(it.hasNext()){
System.out.println(it.next());
}
Collection
coll = map.values();//构建Map集合中所有values值集合
it = coll.iterator();
System.out.println("values集合中的元素为:");
while(it.hasNext()){
System.out.println(it.next());
}
输出结果为:
key集合中的元素为:
1
2
values集合中的元素为:
first
second
三.Map接口的实现类
Map接口实现类有HashMap,TreeMap,LinkedHashMap,WeakHashMap,ConcurrentHashMap,IdentityHashMap.
1)HashMap:
1.一般用HashMap类实现Map集合,因为HashMap是基于哈希表的Map接口的实现类,HashMap能通过哈希码对其内部的映射关系进行快速查找,添加和删除映射关系效率更高.另外hashCode()是根类Object的方法,因此Java的对象都能产生散列码
2.HashMap允许使用null值和null键,但必须要保证键的唯一性,它不保证映射的顺序,而且不保证该顺序恒久不变
2)LinkedHashMap:
类似于HashMap.为了提高速度,它散列化所有元素,但是迭代遍历它的时候,取得的键值对的顺序是它的插入次序(当你调用putAll()方法时,传进来的map的键值对顺序是什么样的,LinkedHashMap输出的顺序就是什么样的),或者是最近最少使用(LRU)的次序.只比HashMap慢一点,但是迭代访问时比较快,因为它使用列表维护内部次序
3
)TreeMap:
1.TreeMap中的映射关系存在一定的顺序,该顺序由Comparable和Comparator决定,它不仅实现了Map接口还实现了java.util.SortedMap接口(TreeMap是SortedMap现阶段的唯一实现),它的映射关系是根据键对象按照一定的顺序排列的,因此不允许键为null.
2.TreeMap带有subMap()方法,它可以返回一个子树.
4)WeakHashMap:
允许释放映射所指向的对象.如果映射之外没有引用指向某个"键",则此"键"可以被垃圾收集器回收.
5)ConcurrentHashMap:
线程安全的Map,不涉及同步加锁.
6)IdentityHashMap:
使用==代替equals()对键进行比较的散列映射.
下面举个例子看看HashMap与TreeMap输出的映射顺序:
Map
map = new HashMap<>();
map.put("21", "二一");
map.put("22", "二二");
map.put("23", "二三");
map.put("24", "二四");
map.put("25", "二五");
map.put("11", "十一");
map.put("12", "十二");
map.put("13", "十三");
map.put("14", "十四");
map.put("15", "十五");
Set
set = map.keySet();//构建Map集合中所有key对象的集合
Iterator
it = set.iterator();//创建集合迭代器
System.out.println("HashMap:");
while(it.hasNext()){
String key = (String)it.next();
String value = (String)map.get(key);
System.out.println(key + " " + value);
}
TreeMap
treeMap = new TreeMap<>();
treeMap.putAll(map);
Iterator
iter = treeMap.keySet().iterator(); System.out.println(); System.out.println("TreeMap:"); while(iter.hasNext()){ String key = (String)iter.next(); String value = (String)treeMap.get(key); System.out.println(key + " " + value); }
输出结果为:
HashMap:
22 二二
11 十一
23 二三
12 十二
24 二四
13 十三
25 二五
14 十四
15 十五
21 二一
TreeMap:
11 十一
12 十二
13 十三
14 十四
15 十五
21 二一
22 二二
23 二三
24 二四
25 二五
可以看到HashMap类实现Map集合没有一定的映射顺序,而TreeMap则是根据key值的升序进行排列.(如果看不到效果,请增加样本容量).
以上面的代码为例,看一看TreeMap的几个方法:
firsKey():返回第一个Key
lastKey():返回最后一个Key
subMap(String fromKey, String toKet):返回从fromKey到toKey这个范围内的Map子集
headMap(String toKey):返回tokey之前的Map子集
tailMap(String fromKey):返回包括fromKey在内以及它之后的Map子集
代码如下:
System.out.println(treeMap.firstKey());
System.out.println(treeMap.lastKey());
System.out.println(treeMap.subMap("12", "21"));
System.out.println(treeMap.headMap("21"));
System.out.println(treeMap.tailMap("21"));
///
输出结果如下:
11
25
{12=十二, 13=十三, 14=十四, 15=十五}
{11=十一, 12=十二, 13=十三, 14=十四, 15=十五}
{21=二一, 22=二二, 23=二三, 24=二四, 25=二五}