-
Map接口
Map为一个接口。实现Map接口的类都有一个特点:有键值对,将键映射到值的对象。 Map不能包含重复的键,每个键可以映射到最多一个值。
Map常见的接口方法有:
V put(K key, V value) 将指定的值与该映射中的指定键相关联(注意,返回值是指被覆盖的value值)
V remove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true
boolean containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true
Collection<V> values() 返回此地图中包含的值的Collection视图。
int size() 返回此地图中键值映射的数量
V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射
Set<K> keySet() 返回此地图中包含的键的Set视图
Set<Map.Entry<K,V>> entrySet() 返回此地图中包含的映射的Set视图
示例1:(遍历Map集合,思路:先获取到键的集合,遍历集合,get方法取出值)
public class Test11 { // Map集合没有生成Iterator的方法,所以要用以下方法遍历 public static void main(String[] args) { HashMap<String,Integer> hm = new HashMap<>(); hm.put("张三",13); hm.put("李四",14); hm.put("王五",15); Set<String> set = hm.keySet(); /*方式1: Iterator<String> it = set.iterator(); while (it.hasNext()){ String s = it.next(); Integer i = hm.get(s); System.out.println(s + "=" + i); }*/ // 方式2: for (String s : set) { Integer i = hm.get(s); System.out.println(s + "=" + i); } } }
示例2:(遍历Map集合,思路:把键值对作为一个对象存进集合,遍历集合,取出对象的属性)
public class Test12 { public static void main(String[] args) { HashMap<String,Integer> hm = new HashMap<>(); hm.put("张三",13); hm.put("李四",14); hm.put("王五",15); Set<Map.Entry<String,Integer>> set = hm.entrySet(); /*方式1: Iterator<Map.Entry<String,Integer>> it = set.iterator(); while (it.hasNext()){ Map.Entry<String,Integer> entry = it.next(); System.out.println(entry.getKey() + "=" + entry.getValue());*/ // 方式2: for (Map.Entry<String,Integer> entry: set) { System.out.println(entry.getKey() + "=" + entry.getValue()); } } }
-
HashMap类
上面的接口方法基本都是HashMap实现的。所以用起来基本一样,不多说。同样的,LinkedHashMap类继承HashMap类,用法基本一样,只是LinkedHashMap底层用了链表实现而已。
-
TreeMap类
可以看做能排序的HashMap。原理其实和TreeSet一样......
关于排序可以参考TreeSet类:https://www.cnblogs.com/chichung/p/10252495.html
-
Hashtable类
Hashtable与HashSet的关系和ArrayList与Vector的关系几乎一样。
- 共同点:
底层都是哈希算法,都是双列集合
- 区别:
1.HashMap是线程不安全的,效率高,JDK1.2版本出现的
Hashtable是线程安全的,效率低,JDK1.0版本出现的
2.HashMap可以存储null键和null值
Hashtable不可以存储null键和null值