JAVA学习总结之Map集合

来源:互联网 发布:安卓投屏软件 airplay 编辑:程序博客网 时间:2024/05/21 06:24
学习之前应该知道:
    Set和Map关系十分亲密,Java源码就是先实现了HashMap、TreeMap等集合,然后通过包装一个所有的value都为null的Map集合实现类Set集合类。

Map集合:
    1.Map用于保存具有映射关系的数据,因此Map集合里保存着两组数值,一组用于保存Map里的key值,
      另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。

    2.Map的key不允许重复,即同一个Map对象的任意两个key通过equals方法比较总是返回false。

    3.key和value之间存在单向一对一关系。

Hashtable和HashMap:都是Map接口的典型实现类,它们之间的关系完全类似于ArrayList和Vector的关系(使用HashMap存在key冲突时仍然具有较好的性能)

Hashtable和HashMap两点典型区别:    

    1.Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable性能高一点;
        但是如果有多个线程访问同一个Map对象时,使用Hashtable实现类会更好。

    2.Hashtbale不允许使用null作为key和value,如果试图把null值放进Hashtable中,会引发空指针异常;
        但HashMap可以使用null作为key或value。

注:1.由于HashMap里的key不能重复,所以HashMap里最多只有一个key-value对的key为null,但可以有无数个key-value对的value为null.
      Hashtable是一个古老的类,因该尽量少使用,即使需要创建线程安全的Map实现类,也无需使用Hashtable实现类,
    可以通过Collections工具类把HashMap变成线程安全的。

1.与HashSet集合不能保证元素的顺序一样,HashMap、Hashtable也不能保证其中的Key-value对的顺序。
    类似于HashSet,HashMap、Hashtbale判断两个 key 相等的标准也是:两个key通过equals方法比较返回true,两个key的hashCode值也相等。
    HashMap、Hashtbale判断两个 value 相等的比较简单:只要两个对象通过equals()方法比较返回true即可。

2.与HashSet类似,如果使用可变对象作为HashMap、Hashtable的key,并且程序修改了作为key的可变对象,
    则也可能出现于HashSet类型的情况:程序再也无法准确访问到Map中被修改过的key.

LinkedHashMap实现类(HashMap的子类):功能是可以记住key-value对的添加顺序。
    使用双向链表来维护key-value对的次序(其实只需要考虑key的次序),该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序保持一致。

    1.LinkedHashMap可以避免对HashMap、Hashtbale里的key-value对进行排序(只要插入key-values对是保持顺序即可),同时又避免使用TreeMap所增加的成本。

    2.LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能;但因为它以链表来维护内部顺序,所以在迭代访问Map里的全部元素时将有较好的性能。

各Map性能分析:
    1.HashMap和Hashtable的实现机制几乎一模一样,但由于Hashtable是一个古老的线程安全的集合,因此HashMap比Hashtable要快.

    2.TreeMap要比HashMap和Hashtable要慢(因为底层采用红黑树管理键值对),但是使用TreeMap的好处是:TreeMap中的键值对总是处于有序状态。

    3.LinkedHashMap比HashMap慢一点,因为它需要维护链表来保持Map中的键值对添加顺序。

    4.IdentityHashMap性能没有特别出色之处,因为它采用和HashMap相似的实现,只是它使用==(如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同))而不是equals()方法来判断元素相等。

    5.EnumMap的性能最好,但它只能使用同一个枚举类的枚举值作为key.


原创粉丝点击