目录
背景
各自完成插入 10万、20万
条随机数,然后再将这些随机数出队列 ;
测试代码
/**
* 测试速度
*/
public String testSpeed(Queue<Integer> queue, int num) {
long start = System.currentTimeMillis();
Random random = new Random(47);
for (int i = 0; i < num; i++) {
queue.enQueue(random.nextInt(num));
}
for (int i = 0; i < num; i++) {
queue.deQueue();
}
long end = System.currentTimeMillis();
return (end - start) / 1000.0 + " s";
}
@Test
public void test() {
// 十万、二十万的数据
int num = 200000;
ArrayQueue<Integer> arrayQueue = new ArrayQueue();
LoopQueue<Integer> loopQueue = new LoopQueue();
// 十万测试的时间: 16.374 s | 二十万测试的时间: 63.724 s
System.out.println(testSpeed(arrayQueue, num));
// 十万测试的时间: 0.085 s 、 | 二十万测试的时间: 0.128 s
System.out.println(testSpeed(loopQueue, num));
}
结果
从打印的时间看,二者的差距是 天壤之别;
循环队列
在完成 10万、20万 数据 入列、出列的时候,均在 1 s
之内 ;
测试 二百万 的时间是 0.8 s
,二千万 数据,时间在 28 s
;
数组队列
在完成 10万、20万 数据 入列、出列的时候,分别使用 16 s
、64 s
;
二百万、二千万,我没测试;但是,我测试 一百万 我等了 17
分钟,没跑完,然后我结束了运行,二千万的数据 ,估计得按 小时
算 ;
备注:我的 CPU
是 i7-4710mq
,具体测试,跟 CPU
型号有关 ;
链表
之前实现的 动态数组
、队列
、栈
其实本质上都是静态的, 底层都是利用 静态数组
创建的,我们需要考虑,什么时候 扩容
,什么时候 缩小
;
而 链表
,是真正的动态结构,它根本不需要去考虑 扩容 、缩小
,因为它本身就是动态的变化着 ;
随机访问
但是 链表
也有缺点,由于底层不再是利用 静态数组 实现的,因此,丧失了 随机访问 能力 ;
因为 静态数组
底层开辟的内存,是连在一起的,可以根据下标,直接计算出偏移量
,直接去访问对应地址的内存 ;
链表
由于是动态的变化的,它的节点之间,是通过 引用
相互连接在一起的 ,是 无法直接计算
出某一个节点的内存地址的,因此,也就不具备随机访问了;