疯狂Java讲义读书笔记08 Java集合-03Map
Java8增强的Map集合
Map可以用于保存具有映射关系的数据,因此map集合里面保存着两组值,一组值用于保存Map里的key,另外一组值用于保存value
Map的key不允许重复
Java8为map新增的方法
java8改进的HashMap和Hashtable实现类
HashMap和Hashtable都是Map接口的典型实现类,它们之间的关系完全类似于ArrayList和Vector
Hashtable是一个线程安全的Map实现类,但HashMap是线程不安全的实现,所以HashMap会比Hashtable的性能高,但如果有多个线程访问同一个Map对象Hashtable会更好
Hashtable不允许使用null作为key和value,如果试图将null值放进Hashtable中,将会引发NullPointerException异常,但HashMap可以使用null作为key或value
由于HashMap里的key不能重复,所以HashMap里面最多只能有一个keyvalue对的key为null,但可以有无数多的keyvalue的value为null。
与HashSet类似的是,尽量不要使用可变对象作为HashMap和Hashtable的key,如果确实需要使用可变对象作为HashMap、Hashtable的key,则尽量不要在程序中修改作为key的可变对象。
LinkedHashMap实现类
HashSet有一个LinkedHashSet子类,HashMap也有一个LinkedHashMap子类,LinkedHashMap也使用双向链表来维护key-value对的次序(其实只需要考虑key的次序),该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序保持一致。
LinkedHashMap可以避免对HashMap、Hashtable里面的key-value进行排序(只要插入key-value对时保持顺序即可),同时又可避免使用TreeMap所增加的成本。
LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但因为它以链表来维护内部顺序,所以迭代访问Map里的全部元素时将有较好的性能。下面程序示范了LinkedHashMap的功能,迭代输出LinkedHashMap的元素时,将会按key-value对的顺序输出

使用Properties读写属性文件
properties类是Hashtable类的子类,正如它的名字暗示的,该对象在处理属性文件时特别方便。Windows平台ini文件就是一种属性文件。
Properties类可以把Map对象和属性文件关联起来,从而可以把map对象中的key-value对写入属性文件中,也可以把属性文件中的“属性名=属性值”加载到Map对象中。由于属性文件的属性名、属性值只能是字符串类型,所以Properties里的key、value都是字符串类型。该类提供了如下三个方法来修改Properties里的key、value值。
properties相当于一个key、value都是string类型的Map

SortedMap接口和treeMap实现类
正如set接口派生出SortedSet子接口,正如SortedSet接口有一个TreeSet实现类一样,Map接口也派生出一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类
TreeMap就是一个红黑树结构,每个key-value对就是作为红黑树的一个节点。TreeMap存储key-value对,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态。TreeMap也有两种排序方式:自然排序和定制排序
Set和Map的关系十分密切
Java源码就是先实现了HashMap、TreeMap等集合,然后包装一个所有value都为null的Map集合实现了Set集合类
WeakHashMap与HashMap的用法基本相似,与HashMap的区别在于,HashMap的key保留了对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap的所有key所引用的对象就不会被垃圾回收,HashMap也不会自动删除这些key所哦对应的key-value对。
但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。
WeakHashMap中的每个key对象只持有对实际对象的弱引用,因此,当垃圾回收了该key所对应的实际对象之后,WeakHashMap会自动删除该key对应的key-value对

如果需要使用WeakHashMap的key来保留对象的弱引用,则不要让该key所引用的对象具有任何强引用,否则失去了WeakHashMap的意义
IdentityHashMap实现类。
这个Map实现类机制与hashMap基本相似,但它在处理两个key相等时比较独特:在IdentityHashMap中,当且仅当两个key严格相等时key1==key2,才认为两个key相等。
对于普通HashMap而言只要equals方法返回true,且hashcode值相等即可。
EnumMap实现类
EnumMap是一个与枚举类一起使用的Map实现,EnumMap中所有key都必须是单个枚举类的枚举值。
创建EnumMap时必须显式或隐式指定它对应的枚举类

各种Map实现类的性能分析
对于Map常用实现类而言,虽然HashMap和hashtable实现机制几乎一样,但是由于Hashtable是一个古老的线程安全的集合,因此HashMap通常比Hashtable要快。
TreeMap通常比HashMap、Hashtale要慢,尤其是在插入删除的时候更慢,因为TreeMap底层采用红黑树来管理key-value对(红黑树的每个节点就是一个key-value对)
使用TreeMap有一个好处:TreeMap中的key-value对总是有序状态,无需专门进行排序操作。当TreeMap被填充之后就可以调用KeySet取得有、由key组成的set,然后使用toArray()方法生成key的数组,接下来使用Arrays的binarySearch方法在已排序的数组中快速查询对象。
但对于一般应用场景,应该多考虑使用HashMap,因为HashMap正是为了快速查询设计的。
操作集合的工具类:Collections
Java提供了一个操作Set、List和Map等集合的工具类:Collections,


设置不可变集合

Enumeration接口时Iterator迭代器的古老版本
通常不需要使用,只能遍历Vector和Hashtable这样的古老集合。

浙公网安备 33010602011771号