java集合点

2015/04/29 00:43
阅读数 13

java集合体系图:



 


Iterator:对集合进行迭代的迭代器。

                                  方法:    hasNet()如果仍有元素可以迭代,则返回true。

                                                   next()     返回迭代的下一个元素。

   remove()从迭代器指向的集合中移除迭代器返回的最后一个元素


Collection:  List  Set   Queue接口的父接口。



Set:Set集合不允许包含相同的元素,集合里的多个对象之间没有明显的顺序。Set判断两个对象相同不是使用==运算符,而是根据equals方法。


HashSet: Set接口的典型实现。按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能

    不能保证元素的排列顺序。

    此实现不是同步的。 如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,那么它必须 保持外部同步。这通常是通过对自然封装该集合的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装”集合。最好在创建时完成这一操作,以防止对 HashSet 实例进行意外的不同步访问: Set s =Collections.synchronizedSet(new HashSet(...));

原理:当想HashSet集合插入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashcode值,然后根据它们的hashcode值决定该对象在HashSet中存储位置。

HashSet集合判断两个元素相等的标准是   两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等

此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对集合进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,Iterator 都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来在某个不确定时间发生任意不确定行为的风险。 

       LinkedHashSet:具有可预知迭代顺序的Set 接口的哈希表和链接列表实现,元素顺序总与添加顺序一致

由于增加了维护链接列表的开支,其性能很可能会比HashSet 稍逊一筹,不过,在迭代访问Set元素时有很好的性能。

不是线程安全的,可以使用Collections.synchronizedSet()方法来“包装”该集合:Set s =Collections.synchronizedSet(new LinkedHashSet(...));


TreeSet:SortedSet接口的实现类。

此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable),或按照在创建 set 时所提供的比较器进行 排序。

Comparable接口:该接口里面定义一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大                                                                                         小。

如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口,否则程序将会抛出异常。

向TreeSet中添加的应该是同一个类的对象。

判断标准是:两个对象通过compareTo(Object obj)方法比较是否返回0;返回0,认为它们相等,否则不相等。

当需要把一个对象放入TreeSet中,重写该对象对应类的equals()方法时,应保证与compareTo(Object  obj)方法有一致的结果:

如果两个对象通过equals()方法比较返回true时,则这两个队象通过compareTo(Object  obj)方法比较应返回0.

不是线程安全的,可以使用Collections.synchronizedSet()方法来“包装”该集合:Set s = Collections.synchronizedSortedSet(new TreeSet(...));


各Set实现类的性能分析:

HashSet和TreeSet是Set的两个典型实现;HashSet的性能总是比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。

LinkedHashSet是HashSet的子类,只有在遍历的时候会很快,其他方面都比HashSet稍慢。



List集合:元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引,通过equals()方法判断两个对象是否相等。

ListIterator接口:继承Iterator接口,提供专门的操作List的方法。

hasPrevious():是否还有上一个元素

previous():返回该迭代器的上一个元素。

add(int index, E element):在指定位置插入一个元素。


  ArrayList和Vector是List的两个典型实现,List 接口的大小可变数组的实现;

size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间 运行,也就 是说,添加 n 个元素需要 O(n) 时间。其他所有操作都以线性时间运行(大体上讲)。

Vector是一个古老的集合。

ArrayList是线程不安全的;

Vector是线程安全的。

Vector的性能比ArrayList的性能要低,实际上,即使需要额外保证ArrayList集合线程安全,也不推荐使用Vector。


固定长度的List:数组的工具类Arrays的内部类ArrayList。是一个固定长度的List集合,程序只能遍历,不可增加,删除。




Queue集合  :模拟队列这种数据结构。队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。



Deque接口:是Queue接口的子接口,代表一个双端队列,可以从两端操作队列的元素。

典型实现:ArrayDeque,基于数组实现的双端队列。在程序需要使用“栈”这种队列时,推荐使用ArrayDeque和LinkedList,而不是Stack。


LinkeList: 既是List接口的实现类,也是Deque接口的实现类,所以既可以根据索引来随机访问集合中的元素,也可以当成双端队列来使用。


LinkedList与ArrayList, ArrayDeque的实现机制完全不同,ArrayList,ArraDeque内部以数组的形式来保存集合中的元素,因此随即访问集合元素时有较好的性能,而LinkedList内部以链表的形式来保存集合中的元素,因此在随即访问元素时性能较差,但在插入,删除元素时性能非常出色。




Map:保存具有映射关系的数据。一个映射不能包含重复的键;每个键最多只能映射一个值。


HashMap和Hashtable:   它们的关系类似于ArrayList和Vector。
Hashtable是一个古老的实现类,也是一个线程安全类,性能比HashMap较低。Hashtable不允许使用null作为key和value,而HashMap可以使用null作为key或value。
由于HashMap里的key不能重复,所以HashMap里做多只有一个key-value对的key为null,但可以有无数个value为null。
为了能在HashMap  Hashtable中存储,获取对象,用作key的对象必须实现hashcode()方法和equals()方法。
HashMap   Hashtable不能保证key-value对的顺序。
判断key相等的标准:两个key通过equals()方法比较返回true,两个key的hashcode值也相等。
判断value相等标准:通过equals()方法比较返回true。

LinkedHashMap:  使用双向链表来维护key-value对的次序。该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序一致。
类似于LinkedHashSet,性能较低,迭代遍历时性能较好。


SortedMap接口和TreeMap实现类:
类似SortedSet和TreeSet,TreeMap也是一个红黑树数据结构,每个key-value对作为一个树的节点,存储key-value对时,需要根据key对节点进行排序:自然排序,定制排序。
TreeMap中判断两个key相等的标准是:两个key通过compareTo()方法返回0,即可认为两个key相等。
重写equals()时应该保持和compareTo()方法的一致性:即equals()方法返回true时,compareTo()方法应该返回0。


各Map实现类的性能分析:
HashMap通常比Hashtable要快一点,因为Hashtable需要额外的线程同步控制。TreeMap通常比HashMap   Hashtable要慢,尤其在插入和删除时更慢,因为底层采用红黑树来管理key-value对。
TreeMap有一个好处:key-value对是有序的,无须专门进行排序操作。
对于一般的应用场景,多考虑HashMap,因为HashMap正是为快速查询设计的。
如果程序需要一个总是排好序的Map时,则考虑使用TreeMap。



HashSet及其子类:采用hash算法来决定集合中的元素的存储位置,并通过hash算法来控制集合的大小。
HashMap   Hashtable及其子类:采用hash算法来决定Map中的key的存储,并通过hash算法来控制集合的大小。


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部