Java再学习-java集合(二)

来源:互联网 发布:太原知达常青藤好进吗 编辑:程序博客网 时间:2024/04/30 12:51

上篇文章介绍了集合下的Set集合和List集合。这次我来介绍一下Queue集合和Map集合


Queue集合

Queue用于模拟队列这种数据结构,队列是FIFO的容器,队列的头部保存在队列存放时间最长的元素,队列尾部保存存放时间最短的元素。Queue有PriorityQueue实现类和Deque接口。

PriorityQueue是一个比较标准的队列实现类,当保存元素时,不是按照队列的顺序,而是按队列元素的大小进行重新排序。就像上篇文章中降到的TreeSet一样。PriorityQueue中不允许插入null元素。

Deque接口

Deque代表的一个双端队列。也可以当做栈来使用,因为该类包含了pop出栈,push入栈等方法。ArrayDeque看名字就知道是基于数组实现的双端队列,所以我们可以和ArrayList进行对比。首先两个集合类的实现机制基本相似,底层都采用一个动态的,可重分配的Object[]数组来存储集合元素,当集合元素超过了该数据的容量时,系统会自动分配一个数据来存储集合元素。

LinkedList实现类,大家可能好奇,为啥不放在List集合讲呢,因为LinkedList还实现了Deque接口,因此它也可以当成双端队列来使用。所以LinkedList是一个功能非常强大的集合类。

最后来对比一下,LinkedList与ArrayList、ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部是数组的形式来保存集合元素,因此随机访问有较好的性能,但是LinkedList内部以链条的形式来保存集合元素,随机访问能力差,但是插入和删除元素时性能非常出色。



代码参考如下:

import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;public class PerformanceTest {public static void main(String[] args) {// 数组String[] tst1 = new String[900000];// 初始化for (int i = 0; i < 900000; i++) {tst1[i] = String.valueOf(i);}// arrayListArrayList al = new ArrayList();for (int i = 0; i < 900000; i++) {al.add(tst1[i]);}//linkedListLinkedList ll = new LinkedList();for(int i =0 ;i<900000;i++){ll.add(tst1[i]);}//迭代访问ArrayList集合的所有元素,并输出迭代时间long start = System.currentTimeMillis();for(Iterator it = al.iterator();it.hasNext();){it.next();}System.out.println("迭代arrayList集合元素的时间:" + (System.currentTimeMillis() - start));start = System.currentTimeMillis();for(Iterator it = al.iterator();it.hasNext();){it.next();}System.out.println("迭代LinedList集合元素的时间:" + (System.currentTimeMillis() - start));}}
执行结果:


Map集合


Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于Map里的value,key和value都可以使任何引用类型的数据。Map的key值不允许重复。明确key和value是一对一的单向关系。

与Set的关系,从接口上看,HashSet、LinkedHashSet、SortedSet、TreeSet等,HashMap、LinkedHashMap、SortedMap、TreeMap等。当我们打开java源码去观察,其实set仅仅是对map的一种重写,将map中的value值全部设值为null。这样map和set的关系就很明确了。

HashMap和HashTable实现类

首先都是Map典型的实现类,关系完全类型ArrayList和Vector的关系。因为HashMap线程不安全,但是Hashtable是不安全,Hashtable的古老从命名都能看出来,一开始都不符合java 的命名规范呢,table的t怎么可以小写呢?

由于HashMap是线程不安全的,所以性能比Hashtable要好的多。

LinkedHashMap实现类

LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序。性能方面LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但是因为它以链表来维护内部顺序,所以在迭代访问Map的全部元素时将有较好的性能。


1 0