Map接口详解
一. Map定义
接口Map<K,V>
类型参数:
K- 此映射所维护的键的类型
V- 映射值的类型
- 映射的数学解释:
- 设A、B是两个非空集合,如果存在一个法则f,使得对A中的每个元素a,按法则f,在B中有唯一确定的元素b与之对应,则称f为从A到B的映射,记作f:A→B。
- 映射关系(两个集合):A集合和B集合. A集合中的每一个元素都可以在B集合中找到唯一的一个值与之对应.
- 严格上说,Map并不是集合,而是两个集合之间的映射关系(Map接口并没有继承于Collection接口)
然而因为Map可以存储数据(每次存储都应该存储A集合中以一个元素(key),和B集合中一个元素(value)),我们还是习惯把Map也称之为集合.
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组用于保存Map里的value,key和value都是可以任意引用类型的数据。Map的key不允许重复,即统一个Map对象的任何两个key通过equals方法比较总是返回false.
给key-value起个名字:Entry,表示一个键值对,对应Map的一个实体;把Entry放到集合set中就是一个Map
如果把Map所有value放在一起来看,元素与元素之间可以重复,每个元素可以根据索引来查找,相当于list集合,只是Map中的索引不再使用整数值,而是以另外一个对象作为索引。如果需要从List集合中取出元素,需要提供该元素的数字索引。
如果需要从Map中取出元素,需要提供该元素的key索引,因此,Map也被称为字典。
二. Map的部分方法:
void clear()
:删除该Map对象中所有key-value对boolean containsKey(Object key)
:查询Map中是否包含一个或多个value,如果包含则返回true。boolean containsValue(Object value)
:查询Map中是否包含一个或者多个value,如果包含则返回true
4.Set entrySet()
:返回Map中所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。Object get(Object key)
:返回指定key所对应的value,如果此Map中不包含该key,则返回null。boolean isEmpty()
:查询Map是否为空(即不包含任何key-value对),如果为空就返回true。Set keySet()
:返回该Map中所有key所组成的Set集合。Object put(Object key,Object value)
:添加一个key-value对,如果当前Map中已有一个与该key相等的key-value对,则新的key-value对会覆盖原来的key-value对。void putAll(Map m )
:将指定Map中的key-value对复制到本Map中。
Map接口提供了大量的实现类,典型实现如下:
HashMap
:采用哈希表算法, 此时Map中的key不会保证添加的先后顺序,key也不允许重复.key判断重复的标准是: key1和key2是否equals为true,并且与hashCode相等.
TreeMap
:采用红黑树算法,此时Map中的key会按照自然顺序或定制排序进行排序,,key也不允许重复.key判断重复的标准是: compareTo/compare的返回值是否为0.
LinkedHashMap
:采用链表和哈希表算法,此时Map中的key会保证先后添加的顺序,key不允许重复.key判断重复的标准和HashMap中的key的标准相同.
Hashtable
:采用哈希表算法,是HashMap的前身(类似于Vector是ArrayList的前身).打死不用.
在Java的集合框架之前,表示映射关系就使用Hashtable.所有的方法都使用synchronized修饰符,线程安全的,但是性能相对HashMap较低.
Properties
:Hashtable的子类,此时要求key和value都是String类型.
用来加载资源文件(properties文件).
一般的,我们定义Map,key都使用不可变的类(String),把key作为value的唯一名称.
HashMap和TreeMap以及LinkedHashMap都是线程不安全的,但是性能较高:
解决方案:
Map m = Collections.synchronizedMap(Map对象);
Hashtable类实现线程安全的,但是性能较低.
哈希表算法:做等值查询最快.
数结构算法:做范围查询最快–>应用到索引上.
三. Map小例
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapCommonDemo {
public static void main(String[] args) {
Map<String,Object> map = new HashMap();
map.put("key_1","溶酶菌");
map.put("key_2","二菌");
map.put("key_3","三菌");
map.put("key_4","可爱的菌");
map.put("key_5","菌");
map.put("key_5", "小小菌");//覆盖前面的key
System.out.println("HashMap:——>"+map);
System.out.println("—————————————————————");
System.out.println("通过key值寻找——>"+map.containsKey("key_5"));
System.out.println("通过val值寻找——>"+map.containsKey("溶酶菌"));
System.out.println("获取key_2对应的值——>"+map.get("key_2"));
System.out.println("—————————————————————");
Set<String> keys = map.keySet();
System.out.println("调用keySet方法.获取map中的key值组成的集合");
for( String key:keys ){
System.out.println(key+"——>"+map.get(key));
}
Collection<Object> values = map.values();
System.out.println("—————————————————————");
System.out.println("获取map中所有的value");
for( Object value:values ){
System.out.println(value);
}
Set< Map.Entry<String,Object>> entrys = map.entrySet();
System.out.println("—————————————————————");
System.out.println("获取map中的键值对,key-value");
for( Map.Entry<String,Object> entry:entrys){
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key+"——>"+value);
}
}
}
运行结果:
HashMap:——>{key_3=三菌, key_2=二菌, key_1=溶酶菌, key_5=小小菌, key_4=可爱的菌}
—————————————————————
通过key值寻找——>true
通过val值寻找——>false
获取key_2对应的值——>二菌
—————————————————————
调用keySet方法.获取map中的key值组成的集合
key_3——>三菌
key_2——>二菌
key_1——>溶酶菌
key_5——>小小菌
key_4——>可爱的菌
————————————————————
获取map中所有的value
三菌
二菌
溶酶菌
小小菌
可爱的菌
—————————————————————
获取map中的键值对,key-value
key_3——>三菌
key_2——>二菌
key_1——>溶酶菌
key_5——>小小菌
key_4——>可爱的菌
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class HashMapDemo {
public static void main(String[] args) {
Map<String,Object > map = new HashMap<>();
map.put("r", "r_value");
map.put("P", "P_value");
map.put("n", "n_value");
map.put("g", "g_value");
map.put("5", "5_value");
map.put("1ctvnt", "1ctvnt_value");
System.out.println("HashMap: "+map);
Map<String,Object > map2 = new TreeMap<>();
map2.put("r", "r_value");
map2.put("P", "P_value");
map2.put("n", "n_value");
map2.put("g", "g_value");
map2.put("5", "5_value");
map2.put("1ctvnt", "1ctvnt_value");
System.out.println("TreeMap: "+map2);
Map<String,Object > map3 = new LinkedHashMap<>();
map3.put("r", "r_value");
map3.put("P", "P_value");
map3.put("n", "n_value");
map3.put("g", "g_value");
map3.put("5", "5_value");
map3.put("1ctvnt", "1ctvnt_value");
System.out.println("LinkedHashMap: "+map3);
}
}
运行结果: