咱们都知道Collection、Set、List接口都属于单值的操做,即:每次只能操做一个对象,而今天介绍的Map与它们不一样的是,每次操做的是一对对象,即二元偶对象,Map中的每一个元素都使用key -- value的形式存储在集合之中,此接口定义以下: public interface Map<K,V>java
(一) 先来看看Map接口中都有哪些经常使用的方法:缓存
No.安全 |
方法或类异步 |
类型性能 |
描述spa |
1线程 |
public void clear()code |
普通对象 |
清空Map集合blog |
2 |
public boolean containsKey(Object key) |
普通 |
判断指定的key是否存在 |
3 |
public boolean containsValue(Object value) |
普通 |
判断指定的value是否存在 |
4 |
public Set<Map.Entry<K,V>> entrySet() |
普通 |
将Map对象变为Set集合 |
5 |
public boolean equals(Object o) |
普通 |
对象比较 |
6 |
public V get(Object key) |
普通 |
根据key取得value |
7 |
public int hashCode() |
普通 |
返回哈希码 |
8 |
public boolean isEmpty() |
普通 |
判断集合是否为空 |
9 |
public Set<K> keySet() |
普通 |
取得全部的key |
10 |
public V put(K key, V value) |
普通 |
向集合中加入元素 |
11 |
public void putAll(Map<? extends K,? extends V> t) |
普通 |
将一个Map集合中的内容加入到另外一个Map |
12 |
public V remove(Object key) |
普通 |
根据key删除value |
13 |
public int size() |
普通 |
取出集合的长度 |
14 |
public Collection<V> values() |
普通 |
取出所有的value |
提出几个问题:
1.为何取出所有的value是Collection形式,而取出来key是Set?
2.返回哈希码有什么做用?
3.取出集合的长度用size而不是length?
(二)介绍经常使用的接口
1. Map.Entry接口
Map.Entry是Map中内部定义的一个接口,专门用来保存keyvalue的内容。
Map.Entry接口定义: public static interface Map.Entry<K,V>
Map.Entry接口的经常使用方法
No. |
方法或类 |
类型 |
描述 |
1 |
public boolean equals(Object o) |
普通 |
对象比较 |
2 |
public K getKey() |
普通 |
取得key |
3 |
public V getValue() |
普通 |
取得value |
4 |
public int hashCode() |
普通 |
返回哈希码 |
5 |
public V setValue(V value) |
普通 |
设置value的值 |
注意思考为何没有setKey的方法呢?
Map与Map.Entry
2.Map接口的经常使用子类
Map接口的经常使用子类:
HashMap:无序存放的,是新的操做类,key不容许重复。
Hashtable:无序存放的,是旧的操做类,key不容许重复。
TreeMap:能够排序的Map集合,按集合中的key排序,key不容许重复。
WeakHashMap:弱引用的Map集合,当集合中的某些内容再也不使用时,能够清除掉无用的数据,可使用gc进行回收。
IdentityHashMap:key能够重复的Map集合。
2. 着重介绍新的子类:HashMap
HashMap自己是Map的子类,直接使用此类为Map接口实例化便可。 HashMap类的定义以下: public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
实例操做一:向集合中增长和取出内容
import java.util.HashMap; import java.util.Map; public class HashMapDemo01 { public static void main(String[] args) { Map<String, String> map = null; // 声明Map对象, map = new HashMap<String, String>(); // key和value是String类 map.put("first", "cool"); // 增长内容 map.put("second", "low"); // 增长内容 map.put("third", "none"); // 增长内容 String val = map.get("first"); // 根据key求出value System.out.println("取出的内容是:" + val); // 输出Map,调用toString() } }
实例操做二:判断指定的key或value是否存在
import java.util.HashMap; import java.util.Map; public class HashMapDemo02 { public static void main(String[] args) { Map<String, String> map = null; // 声明Map对象, map = new HashMap<String, String>(); // key和value是String类 map.put("first", "cool"); // 增长内容 map.put("second", "low"); // 增长内容 map.put("third", "none"); // 增长内容 if (map.containsKey("first")) { // 查找指定的key是否存在 System.out.println("搜索的key存在!"); } else { System.out.println("搜索的key不存在!"); } if(map.containsValue("cool")){ // 查找指定的value是否存在 System.out.println("搜索的value存在!"); }else{ System.out.println("搜索的value不存在!"); } } }
实例操做三:输出所有的key
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class HashMapDemo03 { public static void main(String[] args) { Map<String, String> map = null; // 声明Map对象, map = new HashMap<String, String>(); // key和value是String类 map.put("first", "cool"); // 增长内容 map.put("second", "low"); // 增长内容 map.put("third", "none"); // 增长内容 Set<String> keys = map.keySet(); // 获得所有的key Iterator<String> iter = keys.iterator(); // 实例化Iterator System.out.print("所有的key:"); // 输出信息 while (iter.hasNext()) { // 迭代输出所有的key String str = iter.next(); // 取出集合的key System.out.print(str + "、"); // 输出内容 } } }
实例操做四:输出所有的value
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class HashMapDemo04 { public static void main(String[] args) { Map<String, String> map = null; // 声明Map对象, map = new HashMap<String, String>(); // key和value是String类 map.put("first", "cool"); // 增长内容 map.put("second", "low"); // 增长内容 map.put("third", "none"); // 增长内容 Collection<String> values = map.values(); // 获得所有的value Iterator<String> iter = values.iterator(); // 实例化Iterator System.out.print("所有的value:"); // 输出信息 while (iter.hasNext()) { // 迭代输出 String str = iter.next(); // 取出value System.out.print(str + "、"); // 输出内容 } } }
3.旧的子类:Hashtable
public class HashtableDemo01 { public static void main(String[] args) { Map<String, String> map = null; // 声明Map对象, map = new Hashtable<String, String>(); // key和value是String类 map.put("first", "cool"); // 增长内容 map.put("second", "low"); // 增长内容 map.put("third", "none"); // 增长内容 Set<String> keys = map.keySet(); // 获得所有的key Iterator<String> iter1 = keys.iterator(); // 实例化Iterator System.out.print("所有的key:"); // 输出信息 while (iter1.hasNext()) { // 迭代输出所有的key String str = iter1.next(); // 取出内容 System.out.print(str + "、"); // 输出内容 } Collection<String> values = map.values(); // 获得所有的value Iterator<String> iter2 = values.iterator(); // 实例化Iterator System.out.print("\n所有的value:"); // 输出信息 while (iter2.hasNext()) { // 迭代输出所有的value String str = iter2.next(); // 取出内容 System.out.print(str + "、"); // 输出内容 } } }
HashMap与Hashtable的区别
No. |
比较点 |
HashMap |
Hashtable |
1 |
推出时间 |
JDK 1.2以后推出的,属于新的操做类 |
JDK 1.0时推出,属于旧的操做类 |
2 |
性能 |
采用异步处理方式,性能更高 |
采用同步处理方式,性能较低 |
3 |
线程安全 |
属于非线程安全的操做类 |
属于线程安全的操做类 |
4 |
设置空值 |
容许设置null值 |
不能设置null,若是设置则出现NullPointerException异常 |
4.排序的子类:TreeMap
import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo01 { public static void main(String[] args) { Map<String, String> map = null; map = new TreeMap<String, String>(); // 实例化Map对象 map.put("A、first", "cool"); // 增长内容 map.put("C、second", "low");// 增长内容 map.put("B、third", "none"); // 增长内容 Set<String> keys = map.keySet(); // 获得所有的key Iterator<String> iter = keys.iterator(); // 实例化Iterator while (iter.hasNext()) { // 迭代输出 String str = iter.next(); // 取出key System.out.println(str + " --> " + map.get(str)); // 取出key对应的内容 } } }
5.弱引用类:WeakHashMap
以前所讲解的Map 子类中的数据都是使用强引用保存的,即:里面的内容不论是否使用都始终在集合中保留,若是但愿集合能够自动清理暂时不用的数据就可使用WeakHashMap类。 WeakHashMap的定义以下: public class WeakHashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>
import java.util.Map; import java.util.WeakHashMap; public class WeakHashMapDemo01 { public static void main(String[] args) { Map<String, String> map = null; map = new WeakHashMap<String, String>(); // 实例化Map对象 map.put(new String("A"), new String("first")); map.put(new String("B"), new String("second")); map.put(new String("C"), new String("third")); System.gc(); // 进行垃圾收集 map.put(new String("D"), new String("fourth")) ; System.out.println("内容:" + map); // 通常只会剩下一个内容 <D,fourth> } }
提示:对象的引用强度说明
从JDK1.2版本开始,Java把对象的引用分为四种级别,从而使程式能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
下面来简单了解如下这四种引用的区别:
强引用:当内存不足时,JVM宁肯出现OutOfMemeryError错误而使程序中止,也不会回收此对象来释放空间;
软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存;
弱引用:不管内存是否紧张,被垃圾回收器发现当即回收;
虚引用:和没有任何引用同样。
6.Map接口输出:
对于Map接口来讲,其自己是不能直接使用迭代(例如:Iterator、foreach)进行输出的,由于Map中的每一个位置存放的是一对值(key---->value),而Iterator中每次只能找到一个值。因此,若是此时非要使用迭代进行输出的话,则必须按照如下的步骤完成(以Iterator输出方法为例):
一、将Map的实例经过entrySet()方法变为Set接口对象;
二、经过Set接口实例为Iterator实例化;
三、经过Iterator迭代输出,每一个内容都是Map.Entry的对象;
四、经过Map.Entry进行key---->value的分离。
Map输出方式一:Iterator输出Map
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class IteratorDemo04 { public static void main(String[] args) { Map<String, String> map = null; // 声明Map对象,指定泛型类型 map = new HashMap<String, String>(); // 实例化Map对象 map.put("first", "cool"); // 增长内容 map.put("second", "low"); // 增长内容 map.put("third", "none"); // 增长内容 Set<Map.Entry<String, String>> allSet = null; // 声明一个Set集合,指定泛型 allSet = map.entrySet(); // 将Map接口实例变为Set接口实例 Iterator<Map.Entry<String, String>> iter = null; // 声明Iterator对象 iter = allSet.iterator(); // 实例化Iterator对象 while (iter.hasNext()) { Map.Entry<String,String> me = iter.next();// 找到Map.Entry实例 System.out.println(me.getKey() + " --> " + me.getValue()); // 输出key和value } } }
Map输出方式二:foreach输出Map
import java.util.HashMap; import java.util.Map; public class ForeachDemo02 { public static void main(String[] args) { Map<String, String> map = null; // 声明Map对象,指定泛型类型 map = new HashMap<String, String>(); // 实例化Map对象 map.put("first", "cool"); // 增长内容 map.put("second", "low"); // 增长内容 map.put("third", "none"); // 增长内容 for (Map.Entry<String, String> me : map.entrySet()) {// 输出Set集合 System.out.println(me.getKey() + " --> " + me.getValue());// 输出key和value } } }
注意事项二:直接使用非系统类做为key
若是要使用非系统类做为Map的key,则此类必须覆写Object类中的如下两个方法: hashCode() equals