学习目标
掌握Map接口与Collection接口的不同。
掌握Map与Map.Entry接口的关系。
掌握Map接口常用的子类:HashMap、Hashtable、TreeMap、WeakHashMap。
掌握HashMap与Hashtable的区别。
Collection的操作中每次保存的对象都是一个对象,但是在Map集合中保存的是一对对象,对象的形式是以:key—>value的形式保存的。就好像通讯录一样的。
Map接口中的方法
1、public void clear()普通 清空Map集合。
2、public boolean containsKey(Object key)普通,判断指定的key是否存在。
3、public boolean containsValue(Object value) 普通 判断指定的value是否存在。
4、public Set> 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 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 values() 普通 取出全部的value。
Map与Map.Entry
Map接口的常用子类:
HashMap:无序存放的,是新的操作类,key不允许重复。
Hashtable:无序存放的,是旧的操作类,key值不允许重复。
TreeMap:可以排序的Map集合,按集合中的key排序,key值不允许重复。
WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时,可以清除掉无用的数据,可以使用gc进行回收。
IdentityHashMap:key可以重复的Map集合。
以HashMap为例,Map的基本方法的操作如下:
import java.util.HashMap ;
import java.util.Map ;
public class HashMapDemo01{
public static void main(String args[]){
Map map = null; // 声明Map对象,其中key和value的类型为String
map = new HashMap() ;
map.put("name","liuxun") ; // 增加内容
map.put("QQ","2652790899") ; // 增加内容
map.put("age","23") ; // 增加内容
String val = map.get("name") ; // 根据key取出值
System.out.println("取出的内容是:" + val) ;
}
};
在map中也可以使用containsXxx()方法判断指定的key或者value是否存在。
import java.util.HashMap ;
import java.util.Map ;
public class HashMapDemo02{
public static void main(String args[]){
Map map = null; // 声明Map对象,其中key和value的类型为String
map = new HashMap() ;
map.put("name","liuxun") ; // 增加内容
map.put("QQ","2652790899") ; // 增加内容
map.put("age","23") ; // 增加内容
if(map.containsKey("name")){ // 判断key是否存在
System.out.println("搜索的key存在!") ;
}else{
System.out.println("搜索的key不存在!") ;
}
if(map.containsValue("23")){ // 判断value是否存在
System.out.println("搜索的value存在!") ;
}else{
System.out.println("搜索的value不存在!") ;
}
}
};
如果现在想输出全部的key,则使用如下方法:
Set keySet()
import java.util.HashMap ;
import java.util.Map ;
import java.util.Iterator ;
import java.util.Set ;
public class HashMapDemo03{
public static void main(String args[]){
Map map = null; // 声明Map对象,其中key和value的类型为String
map = new HashMap() ;
map.put("name","liuxun") ; // 增加内容
map.put("QQ","2652790899") ; // 增加内容
map.put("age","23") ; // 增加内容
Set keys = map.keySet() ; // 得到全部的key
Iterator iter = keys.iterator() ;
while(iter.hasNext()){
String str = iter.next() ;
System.out.print(str + "、") ;
}
}
};
既然可以输出全部的key,那么肯定可以输出全部的value
Collectionvalues()
import java.util.HashMap ;
import java.util.Map ;
import java.util.Iterator ;
import java.util.Collection ;
public class HashMapDemo04{
public static void main(String args[]){
Map map = null; // 声明Map对象,其中key和value的类型为String
map = new HashMap() ;
map.put("name","liuxun") ; // 增加内容
map.put("QQ","2652790899") ; // 增加内容
map.put("age","23") ; // 增加内容
Collection values = map.values() ; // 得到全部的value
Iterator iter = values.iterator() ;
while(iter.hasNext()){
String str = iter.next() ;
System.out.print(str + "、") ;
}
}
};
在Map中也存在一个Hashtable子类,实际上这个子类的推出时间与Vector是一样的,都属于旧的类。
import java.util.HashMap ;
import java.util.Hashtable;
import java.util.Map ;
import java.util.Set ;
import java.util.Iterator ;
import java.util.Collection ;
public class HashtableDemo01{
public static void main(String args[]){
Map map = null; // 声明Map对象,其中key和value的类型为String
map = new Hashtable() ;
map.put("name","liuxun") ; // 增加内容
map.put("QQ","2652790899") ; // 增加内容
map.put("age","23") ; // 增加内容
System.out.print("全部的key:") ;
Set keys = map.keySet() ; // 得到全部的key
Iterator iter = keys.iterator() ;
while(iter.hasNext()){
String str = iter.next() ;
System.out.print(str + "、") ;
}
System.out.print("\n全部的value:") ;
Collection values = map.values() ; // 得到全部的value
Iterator iter2 = values.iterator() ;
while(iter2.hasNext()){
String str = iter2.next() ;
System.out.print(str + "、") ;
}
}
};
HashMap与Hashtable的区别:
1、从推出时间上看:HashMap是JDK1.2之后推出的,属于新的操作类,Hashtable是JDK1.0时推出 属于旧的操作类。
2、从性能上看:HashMap采用异步处理方式,性能更高,Hashtable采用同步的处理方式性能较低。
3、从线程安全看:HashMap属于非线程安全的操作类,Hashtable属于线程安全的操作类。
在Map中还存在一个TreeMap的子类,此类属于排序类,按key排序。
import java.util.TreeMap ;
import java.util.Map ;
import java.util.Set ;
import java.util.Iterator ;
import java.util.Collection ;
public class TreeMapDemo01{
public static void main(String args[]){
Map map = null; // 声明Map对象,其中key和value的类型为String
map = new TreeMap() ;
map.put("Zname","liuxun") ; // 增加内容
map.put("XQQ","2652790899") ; // 增加内容
map.put("Yage","23") ; // 增加内容
Set keys = map.keySet() ; // 得到全部的key
Iterator iter = keys.iterator() ;
while(iter.hasNext()){
String str = iter.next() ;
System.out.println(str + " --> " + map.get(str)) ; // 取出内容
}
}
};
使用TreeMap可以方便的完成排序的操作。如果自定义的类要想作为key的话,则肯定要实现Comparable接口,指定比较的规则。
弱引用类:WeakHashMap
之前接触到的Map子类中的数据都是使用强引用保存的。即:里面的内容不管是否使用都始终在集合中保留,如果希望集合可以自动清理暂时不用的数据就可以使用WeakHashMap类。
WeakHashMap的定义如下:
public class WeakHashMap extends AbstractMap implements Map
如果假设一个Map中的某些内容长时间不使用的话,按照之前的做法是不会删除掉的,如果希望可以自动删除掉,可以使用弱引用。当里面的某些内容不使用时,可以自动删除掉。
import java.util.WeakHashMap ;
import java.util.Map ;
import java.util.Set ;
import java.util.Iterator ;
import java.util.Collection ;
public class WeakHashMapDemo01{
public static void main(String args[]){
Map map = null; // 声明Map对象,其中key和value的类型为String
map = new WeakHashMap() ;
map.put(new String("name"),new String("liuxun")) ;
map.put(new String("QQ"),new String("2652790899")) ;
map.put(new String("age"),new String("23")) ;
System.gc() ; // 强制性进行垃圾的收集操作
map.put(new String("sex"),new String("man")) ;
System.out.println(map) ;
}
};
对象的引用强度说明:
从JDK1.2版本开始,Java把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用、虚引用,四种引用的区别如下:
强引用:当内存不足时,JVM宁可出现OutOfMemoryError错误使程序停止,也不会回收此对象来释放空间。
软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存。
弱引用:无论内存是否紧张,被垃圾回收器发现立即回收。
虚引用:和没有任何引用一样。
总结:
1、掌握Map的特点及其基本操作。
2、Map与Map.Entry的关系。
3、Map的子类:HashMap、Hashtable、TreeMap、WeakHashMap。
4、主要功能就是查找,根据key找到value。
5、与Set的相似之处:对于非排序的HashMap,key不能重复,它判断key是否重复还是根据对象的hashCode()和equals()方法,如果是自定义的对象建议重写这两个方法。
对于排序的TreeMap 主要根据key实现的comparable接口中的compareTo(Object o)方法对key进行排序。