不得不学的java集合框架( 三 )


ListIterator接口继承Iterator接口,提供了专门操作List的方法 。ListIterator接口在Iterator接口的基础上增加了以下几个方法:
♦ boolean hasPrevious():判断集合里是否存在上一个元素 。如果有,该方法返回 true 。♦ Object previous():返回集合里上一个元素 。♦ void add(Object o):在指定位置插入一个元素 。
以上两个接口相比较,不难发现,ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator还可以通过add()方法向List集合中添加元素(Iterator只能删除元素) 。
4. Map集合
Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据 。key值不允许重复,可以为null 。如果添加key-value对时Map中已经有重复的key,则新添加的value会覆盖该key原来对应的value 。常用实现类有HashMap、LinkedHashMap、TreeMap等 。
Map常见方法(来源于API)如下:
1)HashMap与Hashtable
HashMap与Hashtable是Map接口的两个典型实现,它们之间的关系完全类似于ArrayList与Vertor 。HashTable是一个古老的Map实现类,它提供的方法比较繁琐,目前基本不用了,HashMap与Hashtable主要存在以下两个典型区别:
♦ HashMap是线程不安全,HashTable是线程安全的 。
♦ HashMap可以使用null值最为key或value;Hashtable不允许使用null值作为key和value,如果把null放进HashTable中,将会发生空指针异常 。
为了成功的在HashMap和Hashtable中存储和获取对象,用作key的对象必须实现hashCode()方法和equals()方法 。
HashMap工作原理如下:
HashMap基于hashing原理,通过put()和get()方法存储和获取对象 。当我们将键值对传递给put()方法时,它调用建对象的hashCode()方法来计算hashCode值,然后找到bucket位置来储存值对象 。当获取对象时,通过建对象的equals()方法找到正确的键值对,然后返回对象 。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会存储在链表的下一个节点中 。
2)LinkedHashMap实现类
LinkedHashMap使用双向链表来维护key-value对的次序(其实只需要考虑key的次序即可),该链表负责维护Map的迭代顺序,与插入顺序一致,因此性能比HashMap低,但在迭代访问Map里的全部元素时有较好的性能 。
3)Properties
Properties类时Hashtable类的子类,它相当于一个key、value都是String类型的Map,主要用于读取配置文件 。
4)TreeMap实现类
TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点 。TreeMap存储key-value对时,需要根据key对节点进行排序 。TreeMap也有两种排序方式:
♦ 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException 。
♦ 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序 。
5)各Map实现类的性能分析
♦ HashMap通常比Hashtable(古老的线程安全的集合)要快
♦ TreeMap通常比HashMap、Hashtable要慢,因为TreeMap底层采用红黑树来管理key-value 。

  • ♦ LinkedHashMap比HashMap慢一点,因为它需要维护链表来爆出key-value的插入顺序 。




推荐阅读