Java Map集合知识点整理(疯狂Java讲义读书笔记)

来源:互联网 发布:用python产生文件 编辑:程序博客网 时间:2024/06/05 16:15

JDK文档:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh


这里写图片描述


Map

Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map中的Key值,另一组值用于保存Map中的value。key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何key值通过equals方法返回总是false。
这里写图片描述


HashMap和HashTable实现类:

HashMap和Hashtable都是Map接口的典型实现类,它们之间的关系完全类似于ArrayList和Vector的关系。
HashMap和Hashtable的典型区别:
1.Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点;但如果多个线程访问同一个Map对象时,使用Hashtable实现类会更好。

2.Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable中会抛出NullPointerException异常,但HashMap可以使用null作为key或者value。

注意:与HashSet集合不能保证元素的顺序一样,HashMap,Hashtable也不能保证其中的key-value对的顺序。类似HashSet集合,HashMap,Hashtable判断两个key相等的标准也是:两个key通过equals()方法比较返回true,两个key的HashCode值也相等。


LinkedHashMap实现类

HashSet有一个子类是LinkedHashSet,HashMap也有一个LinkedHashMap子类,LinkedHashMap也使用双向链表来维护key-value对的次序(其实只需要考虑key的次序),该链表负责维护Map的迭代顺序,迭代顺序与Key-value对的插入顺序保持一致。
LinkedHashMap可以避免对HashMap,Hashtable里的key-value对进行排序(只需要插入key-value对时保持顺序即可),同时又可避免使用TreeMap所增加的成本。
LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能;但因为它以链表来维护内部顺序,所以在迭代访问Map里面的全部元素时有较好的性能。


SortedMap接口和TreeMap实现类:

正如Set接口派生了SortedSet子接口,SortedSet接口有一个TreeSet实现类一样,Map接口也派生出了一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类。
TreeMap就是一个红黑树数据结构,每个Key-value对即作为红黑树的一个节点,TreeMap存储key-value对(节点)时,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态。TreeMap也有两种排序形式。

1.自然排序:
采用自然顺序的 TreeMap集合中的元素必须实现Compareable接口,而且应用是同一个类的多个实例,否则可能导致ClassCastExcepation异常。

2.定制排序:
创建TreeMap集合时,传入一个Compareable对象,该对象负责对队列中所有的元素进行排序。采用定制排序时不要求元素实现Compareable接口。

TreeMap中判断两个key相等的标准是:两个key通过compareTo()方法返回0,TreeMap即认为这两个key是相等的。

WeakHashMap实现类

WeakHashMap与HashMap的用法基本相似,与HashMap区别在于,HashMap的key保留了对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap的所有key所引用的对象就不会被垃圾回收,HashMap也不会自动删除这些key所对应的key-value对。但是WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用的变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。

各Map实现类的性能分析

对于Map的常用实现类而言,HashMap和Hashtable的效率大致相同,因为它们的实现机制几乎完全一样;但HashMap通常比Hashtable要快一点,因为Hashtable通常需要额外的线程同步控制。
TreeMap通常比HashMap,HashTable要慢(尤其在插入,删除key-value对时更慢),因为TreeMap底层采用红黑树来管理key-value对(红黑树的每一个节点都是一个key-value对)。
使用TreeMap有一个好处就是;TreeMap中的Key-value对总是处于有序状态,无须专门进行排序操作。
LinkedHashMap比HashMap慢一点,因为它是需要维护链表来保持Map中的key-value时添加顺序。

原创粉丝点击