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

【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> 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 keySet()                普通    取得所有的key
10    public V put(K key,V value)            普通    向集合中加入元素
11    public void putAll(Map t)普通    将一个Map集合中的内容加入到别一个Map
12    public V remove(Object key)            普通    根据key删除value
13    public int size()                普通    取得集合长度
14    public Collection values()            普通    取得全部的value


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

Map与Map.entry的关系:
【Java类集】_Map接口笔记(实例亲测)_第1张图片

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

import java.util.HashMap;
import java.util.Map;
public class HashMapDemo01{
    public static void main(String[] args){
        Map map = null;
        map = new HashMap();
        map.put("mldn","www.mldn.cn");
        map.put("zhinangtuan","www.zhinangtuan.cn");
        map.put("mldnjava","www.mldnjava.cn");
        String val = map.get("mldn");
        System.out.println("取出的内容是:"+val);
    }
}



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

在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 = new HashMap();
        map.put("mldn","www.mldn.cn");
        map.put("zhinangtuan","www.zhinangtuan.cn");
        map.put("mldnjava","www.mldnjava.cn");
        if(map.containsKey("mldn")){
            System.out.println("搜索的key存在!");
        }else{
            System.out.println("搜索的key不存在!");
        }
        if(map.containsValue("www.mldn.cn")){    //判断value是否存在
            System.out.println("搜索的value存在!");
        }else{
            System.out.println("搜索的value不存在!");
        }    
    }
}


输出:
搜索的key存在!
搜索的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 = new HashMap();
        map.put("mldn","www.mldn.cn");
        map.put("zhinangtuan","www.zhinangtuan.cn");
        map.put("mldnjava","www.mldnjava.cn");
        Set keys = map.keySet();
        Iterator iter = keys.iterator();
        while(iter.hasNext()){
            String str = iter.next();
            System.out.print(str+"、");
        }
    }
}


输出:

zhinangtuan、mldn、mldnjava、

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

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 = new HashMap();
        map.put("mldn","www.mldn.cn");
        map.put("zhinangtuan","www.zhinangtuan.cn");
        map.put("mldnjava","www.mldnjava.cn");
        Collection keys = map.values();
        Iterator iter = keys.iterator();
        while(iter.hasNext()){
            String str = iter.next();
            System.out.print(str+"、");
        }
    }
}


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

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

import java.util.Hashtable;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;
import java.util.Collection;
public class HashtableDemo01{
    public static void main(String[] args){
        Map map = null;
        map = new Hashtable();
        map.put("mldn","www.mldn.cn");
        map.put("zhinangtuan","www.zhinangtuan.cn");
        map.put("mldnjava","www.mldnjava.cn");
        Set keys = map.keySet();
        Iterator iter = keys.iterator();
        while(iter.hasNext()){
            String str = iter.next();
            System.out.print(str+"、");
        }
        System.out.println("");
        Collection values = map.values();
        Iterator iterv = values.iterator();
        while(iterv.hasNext()){
            String str = iterv.next();
            System.out.print(str+"、");
        }
    }
}


输出:

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排序。

import java.util.TreeMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;
import java.util.Collection;
public class TreeMapDemo01{
    public static void main(String[] args){
        Map map = null;
        map = new TreeMap();
        map.put("A、mldn","www.mldn.cn");
        map.put("B、zhinangtuan","www.zhinangtuan.cn");
        map.put("C、mldnjava","www.mldnjava.cn");
        Set keys = map.keySet();
        Iterator iter = keys.iterator();
        while(iter.hasNext()){
            String str = iter.next();
            System.out.print(str+"、");
        }
        System.out.println("");
        Collection values = map.values();
        Iterator iterv = values.iterator();
        while(iterv.hasNext()){
            String str = iterv.next();
            System.out.print(str+"、");
        }
    }
}


输出:

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 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 = new WeakHashMap();
        map.put(new String("mldn"),new String("www.mldn.cn"));
        map.put(new String("zhinangtuan"),new String("www.zhinangtuan.cn"));
        map.put(new String("mldnjava"),new String("www.mldnjava.cn"));
        System.gc();
        map.put(new String("lxh"),new String("lixinghua"));
        System.out.println(map);
    }
}


输出:

{lxh=lixinghua}

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

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

4、总结

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

你可能感兴趣的:(Java)