1、什么是Map
Map是一种键值对(key,value)集合,Map集合中每一个元素都包含一个键对象和一个值对象。其中键对象不允许重复,值对象可以重复,并且值对象可以为任意类型,比如List,Map,Set,String 等等。 【将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值】
Map接口主要有两个实现类:HashMap 类和 TreeMap 类,其中,HashMap 类按哈希算法类存取键对象,而TreeMap 类可以对键对象进行排序。
2、Map常用接口
方法名称 | 说明 |
V get(Object key) | 返回指定键所映射的值,如果此映射不包含该键的映射关系,则返回null 。V 表示值的数据类型 |
V put(K key, V value) | 向Map 集合中添加键-值对,将指定的值与此映射中指定键关联 |
V remove(Object key) | 从Map 集合中删除key 对应的键-值对,返回key 的value 值,如果没有,则返回null |
Set entrySet() | 返回Map 集合中所有键-值对的Set 集合,此Set集合中的元素数据类型为 Map.Entry<,> |
Set ketSet() | 返回Map 集合中所有键对象的Set 集合 |
3、Map的四种遍历方法
第一种(普遍使用,二次取值):
1 通过Map.keySet 遍历key 和value
2 for (String key : map.keySet()) { 3 System.out.println("key= "+ key + " and value= " + map.get(key)); 4 }
第二种
1 通过Map.entrySet 使用iterator 迭代器遍历key 和value 2 Iterator<Map.Entry<String,String>> iter = map.entrySet().iterator(); 3 while(iter.hashNext()){ 4 Map.Entry<String,String> entry = iter.next(); 5 System.out.println("key = " + entry.getKey() + ",value = “ + entry.getValue()); 6 }
第三种:推荐,尤其是容量大时
1 通过Map.entrySet 遍历key 和value 2 for(Map.Entry<String,String> entry : map.entrySet()){ 3 System.out,println("key = " + entry.getKey() + ", value = " + entry.getvalue()); 4 }
第四种
1 通过map.values() 遍历所有的value,但不能遍历key 2 for(String value : map.values()){ 3 System.out.println("value = " + value); 4 }
释义:
Entry
Map中存放的元素均以键值对,故而每一个键值必然存在一个映射关系。
Map中采用Entry 内部类来表示一个映射项,映射项包含Key 和Value,故而键-值对 = Entry。
Map.Entry 里面包含getKey() 和 getValue() 方法
entrySet
entrySet 是Java 中 键-值 对的集合,Set 里面的类型是Map.Entry,一遍可以通过map.entrySet 得到
entrySet 实现了Set 接口,里面存放的是键值对,一个K对应一个V,即通过getKey() 得到K,getValue() 得到V。
keySet
keySet 是键的集合,Set 里面的类型即key 的类型。
4、HashMap 和 HashTable 的区别
- HashMap 允许key 或者 value 为null,HashTable 不允许。
- HashMap 是线程不安全的,HashTable 是线程安全的,故而执行效率HashMap 比HashTable 高。【在多线程并发的环境下,可以直接使用HashTable,HashMap 需要同步处理】
- HashMap 是重新计算hash值,而HashTable 是直接使用对象的hashCode , 哈希值的使用不同。
- HashMap 中hahs 数组的默认大小是16,而且一定是2的指数,而HashTable 中hash 数组默认大小是11,增加的方式是 old *2+1。
- HashMap 继承了AbstrcatMap 类,HashTable 继承了 Dictoinary ,但两者都实现了 Map 接口。
- HashMap 没有 contains() 方法,HashTable 中的contains() 与containsValue() 功能相同。
- HashMap 和HashTable 都使用了itorator ,HashTable 还保留了 Enumetaion。