【Java类集】_Map接口笔记(实例亲测)

来源:互联网 发布:linux所有版本 编辑:程序博客网 时间:2024/06/17 01:26

【Java类集】_Map接口笔记(实例亲测)

分类: Java
【Java类集】_Map接口笔记

掌握Map接口与Collection接口不同
掌握Map与Map.Entry接口的关系
掌握Map接口的常用子类:HashMap、HashTable、TreeMap、WeekHashMap
掌握HashMap与HashTable的区别


3、具体内容

Collection的操作中之前已经发现,每次保存对象都一个对象,但是在Map中保存是的一对对象,对象的形式是以:key->value的形式保存的。
就好像电话本:张三->123456

Map接口中的方法

No.    方法或类                    类型    描述
1    public void clear()                普通    清空Map集合
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 K)                普通    根据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


Map接口的常用子类:
HashMap:无序存放的,是新的操作类,key不允许重复。
Hashtable:无序存放的,是旧的操作类,key不允许重复。
TreeMap:可以排序的Map集合,按集合中的key排序,key不允许重复。
WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时,可以清楚掉无用的数据,可以使用gc进行回收。
IdentityHashMap:key可以重复的Map集合。

Map与Map.entry的关系:


以HashMap为例,说明Map的基本方法的操作。

[java] view plaincopyprint?
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3. public class HashMapDemo01{  
  4.     public static void main(String[] args){  
  5.         Map<String,String> map = null;  
  6.         map = new HashMap<String,String>();  
  7.         map.put("mldn","www.mldn.cn");  
  8.         map.put("zhinangtuan","www.zhinangtuan.cn");  
  9.         map.put("mldnjava","www.mldnjava.cn");  
  10.         String val = map.get("mldn");  
  11.         System.out.println("取出的内容是:"+val);  
  12.     }  
  13. }  



输出:取出的内容是:www.mldn.cn

在map中也可以使用containsXxx()方法判断指定的key或者value是否存在。

[java] view plaincopyprint?
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3. public class HashMapDemo02{  
  4.     public static void main(String[] args){  
  5.         Map<String,String> map = null;  
  6.         map = new HashMap<String,String>();  
  7.         map.put("mldn","www.mldn.cn");  
  8.         map.put("zhinangtuan","www.zhinangtuan.cn");  
  9.         map.put("mldnjava","www.mldnjava.cn");  
  10.         if(map.containsKey("mldn")){  
  11.             System.out.println("搜索的key存在!");  
  12.         }else{  
  13.             System.out.println("搜索的key不存在!");  
  14.         }  
  15.         if(map.containsValue("www.mldn.cn")){    //判断value是否存在  
  16.             System.out.println("搜索的value存在!");  
  17.         }else{  
  18.             System.out.println("搜索的value不存在!");  
  19.         }      
  20.     }  
  21. }  


输出:
搜索的key存在!
搜索的value存在!

如果现在想输出全部的key,则使用如下方法:
Set<K> keySet()

[java] view plaincopyprint?
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3. import java.util.Iterator;  
  4. import java.util.Set;  
  5. public class HashMapDemo03{  
  6.     public static void main(String[] args){  
  7.         Map<String,String> map = null;  
  8.         map = new HashMap<String,String>();  
  9.         map.put("mldn","www.mldn.cn");  
  10.         map.put("zhinangtuan","www.zhinangtuan.cn");  
  11.         map.put("mldnjava","www.mldnjava.cn");  
  12.         Set<String> keys = map.keySet();  
  13.         Iterator<String> iter = keys.iterator();  
  14.         while(iter.hasNext()){  
  15.             String str = iter.next();  
  16.             System.out.print(str+"、");  
  17.         }  
  18.     }  
  19. }  


输出:

zhinangtuan、mldn、mldnjava、

既然可以输出全部的key,那么就肯定可以输出全部的value
    Collection<V> values()

[java] view plaincopyprint?
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3. import java.util.Iterator;  
  4. import java.util.Collection;  
  5. public class HashMapDemo04{  
  6.     public static void main(String[] args){  
  7.         Map<String,String> map = null;  
  8.         map = new HashMap<String,String>();  
  9.         map.put("mldn","www.mldn.cn");  
  10.         map.put("zhinangtuan","www.zhinangtuan.cn");  
  11.         map.put("mldnjava","www.mldnjava.cn");  
  12.         Collection<String> keys = map.values();  
  13.         Iterator<String> iter = keys.iterator();  
  14.         while(iter.hasNext()){  
  15.             String str = iter.next();  
  16.             System.out.print(str+"、");  
  17.         }  
  18.     }  
  19. }  


输出:www.zhinangtuan.cn、www.mldn.cn、www.mldnjava.cn、

在Map中也存在一个Hashtable子类,实际上这个子类的推出时间与Vector是一样的,都属于旧类。

[java] view plaincopyprint?
  1. import java.util.Hashtable;  
  2. import java.util.Map;  
  3. import java.util.Iterator;  
  4. import java.util.Set;  
  5. import java.util.Collection;  
  6. public class HashtableDemo01{  
  7.     public static void main(String[] args){  
  8.         Map<String,String> map = null;  
  9.         map = new Hashtable<String,String>();  
  10.         map.put("mldn","www.mldn.cn");  
  11.         map.put("zhinangtuan","www.zhinangtuan.cn");  
  12.         map.put("mldnjava","www.mldnjava.cn");  
  13.         Set<String> keys = map.keySet();  
  14.         Iterator<String> iter = keys.iterator();  
  15.         while(iter.hasNext()){  
  16.             String str = iter.next();  
  17.             System.out.print(str+"、");  
  18.         }  
  19.         System.out.println("");  
  20.         Collection<String> values = map.values();  
  21.         Iterator<String> iterv = values.iterator();  
  22.         while(iterv.hasNext()){  
  23.             String str = iterv.next();  
  24.             System.out.print(str+"、");  
  25.         }  
  26.     }  
  27. }  


输出:

mldn、mldnjava、zhinangtuan、
www.mldn.cn、www.mldnjava.cn、www.zhinangtuan.cn、

HashMap与Hashtable的区别
No.    比较点        HashMap                Hashtable
1    推出时间    JDK1.2之后推出,属于新的操作类    JDK1.0推出,属于旧的操作类        
2    性能        采用异步处理方式,性能更高    采用同步处理方式,性能较低
3    线程安全    属于非线程安全的操作类        属于线程安全的操作类

在Map中还存在一个TreeMap的子类,此类也属于排序类,按key排序。

[java] view plaincopyprint?
  1. import java.util.TreeMap;  
  2. import java.util.Map;  
  3. import java.util.Iterator;  
  4. import java.util.Set;  
  5. import java.util.Collection;  
  6. public class TreeMapDemo01{  
  7.     public static void main(String[] args){  
  8.         Map<String,String> map = null;  
  9.         map = new TreeMap<String,String>();  
  10.         map.put("A、mldn","www.mldn.cn");  
  11.         map.put("B、zhinangtuan","www.zhinangtuan.cn");  
  12.         map.put("C、mldnjava","www.mldnjava.cn");  
  13.         Set<String> keys = map.keySet();  
  14.         Iterator<String> iter = keys.iterator();  
  15.         while(iter.hasNext()){  
  16.             String str = iter.next();  
  17.             System.out.print(str+"、");  
  18.         }  
  19.         System.out.println("");  
  20.         Collection<String> values = map.values();  
  21.         Iterator<String> iterv = values.iterator();  
  22.         while(iterv.hasNext()){  
  23.             String str = iterv.next();  
  24.             System.out.print(str+"、");  
  25.         }  
  26.     }  
  27. }  


输出:

A、mldn、B、zhinangtuan、C、mldnjava、
www.mldn.cn、www.zhinangtuan.cn、www.mldnjava.cn、

使用TreeMap可以方便的完成排序的操作,如果自定义的类要做为key的话,则肯定要实现Comparable接口,指定比较的规则。

弱引用:WeakHashMap

之前所讲解的Map子类中的数据都是使用强引用保存的,即:里面的内容不管是否使用都始终在集合中保留,如果希望集合可以自动清理暂时不用的数据就可以使用WeakHashMap类。

WeakHashMap的定义如下:

public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>

如果假设一个Map中的某些内容长时间不使用的话,按照之前的做法是不会删除掉的,如果希望其可以自动删除掉,可以使用弱引用

[java] view plaincopyprint?
  1. import java.util.WeakHashMap;  
  2. import java.util.Map;  
  3. import java.util.Set;  
  4. import java.util.Iterator;  
  5. import java.util.Collection;  
  6. public class WeakHashMapDemo01{  
  7.     public static void main(String[] args){  
  8.         Map<String,String> map = null;  
  9.         map = new WeakHashMap<String,String>();  
  10.         map.put(new String("mldn"),new String("www.mldn.cn"));  
  11.         map.put(new String("zhinangtuan"),new String("www.zhinangtuan.cn"));  
  12.         map.put(new String("mldnjava"),new String("www.mldnjava.cn"));  
  13.         System.gc();  
  14.         map.put(new String("lxh"),new String("lixinghua"));  
  15.         System.out.println(map);  
  16.     }  
  17. }  


输出:

{lxh=lixinghua}

提示:对象的引用强度说明
从JDK1.2版本开始,Java把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用,软引用,弱引用和虚引用,下面来简单了解以下四种引用的区别:

强引用:当内存不足时,JVM宁可出现OutOfMemeryError错误而使程序停止,也不会回收此对象来释放空间。
软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存。
弱引用:无论内存是否紧张,被垃圾回收器发现立即回收
虚引用:和没有任何引用一样

4、总结

1.介绍了Map的特点及基本操作
2.Map与Map.Entry的关系
3.Map的子类:HashMap、Hashtable、TreeMap、WeakHashMap
4.主要功能就是查找,根据key找到value
0 0