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的全部元素时将有较好的性能。
- Java再学习-java集合(二)
- java之集合学习(二)
- JAVA集合学习总结(二)
- java学习笔记(二十二)集合
- Java基础学习(二)---集合
- java集合学习二List
- java集合(二)
- Java集合(二)
- Java集合(二)
- JAVA---------集合(二)
- Java再学习-java集合(一)
- Java集合概述(二):List集合
- Java集合(二)List集合
- 黑马程序员Java学习日记(5)集合(二)
- Java集合源码学习(二)ArrayList分析
- java日常学习:集合(二)list和set接口
- JAVA学习笔记(二十)- 集合 List
- JAVA学习笔记(二十一)- 集合 Set
- 二叉树中和为某一值的路径
- Python数据可视化
- activiti 排他网管(七)
- 《失控》(凯文·凯利)读书分享
- UVA 11300 Spreading the Wealth(技巧:中位数 推公式)
- Java再学习-java集合(二)
- ScrollView下,ListView重复调用getview解决方案
- ios 滑动返回 pop
- hdoj2011 (java)多项式求和
- 《CSS3实战》笔记--渐变设计(一)
- c++的灵魂,类的书写的一些看法
- 谈谈低延迟对音质的负面影响,顺便谈谈WASAPI
- std::for_each
- Android getWidth和getMeasuredWidth 区别