在编程过程中,会很频繁的使用集合,集合的相关知识也非常重要,也是每一个开发人员必须掌握的知识。
一:集合的概念
集合:保存数量不确定的数据,以及保存具有映射关系的数据的容器,简单的理解就是用于存储数量不等的多个对象的容器。
集合和数组不一样,数组元素既可以是基本类型的值,也可以是对象(对象的引用变量);而集合里只能保存对象(对象的引用变量)。
Java集合类主要由两个集合框架的根接口派生而出:Collection和Map
Java中Collection接口的体系机构:
今天这篇文章主要对List接口集合下的实现类就行分析。
总结概述
1.List继承了Collection,是有序的列表。
2.实现类有ArrayList、LinkedList、Vector、Stack等
(1)ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量!
(2)LinkedList是基于链表实现的,是一个双向循环列表。可以被当做堆栈使用!
(3)Vector是基于数组实现的,是一个矢量队列,是线程安全的!
(4)Stack是基于数组实现的,是栈,它继承与Vector,特性是FILO(先进后出)!
使用场景
在实际的应用中如果使用到队列,栈,链表,首先可以想到使用List。不同的场景下面使用不同的工具,效率才能更高!
1 当集合中对插入元素数据的速度要求不高,但是要求快速访问元素数据,则使用ArrayList!
2.当集合中对访问元素数据速度不做要求不高,但是对插入和删除元素数据速度要求高的情况,则使用LinkedList!
3.当集合中有多线程对集合元素进行操作时候,则使用Vector!但是现在BVector现在一般不再使用,如需在多线程下使用,可以用CopyOnWriteArrayList,在java.util.concurrent包下。
4.当集合中有需求是希望后保存的数据先读取出来,则使用Stack!
性能测试
/**
- Copyright © 2018 westlife.All rights reserved.
- @Package: com.test
- @author: ys
- @date: 2018年5月23日 上午10:20:54
*/
package com.test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import java.util.Vector;
/**
- <p>Title: ListTest </p>
- <p>Description: </p>
- <p>Company: westlife</p>
- @author westlife
- @date 2018年5月23日 上午10:20:54
/
/ - 性能测试,通过插入、随机读取和删除对ArrayList、LinkedList、Vector和Stack进行测试!
- 结论:看LinkedList
- 插入10万个元素,LinkedList所花时间最短:17 ms。
- 删除10万个元素,LinkedList所花时间最短: 9 ms。
- 遍历10万个元素,LinkedList所花时间最长:10255 ms;而ArrayList、Stack和Vector则相差不多,都只用了几秒。
- (1) 对于需要快速插入,删除元素,应该使用LinkedList。
- (2) 对于需要快速随机访问元素,应该使用ArrayList。
*/
public class ListTest {
private static final int COUNT = 100000; //十万
private static ArrayList<Object> arrayList = new ArrayList<Object>();
private static LinkedList<Object> linkedList = new LinkedList<Object>();
private static Vector<Object> vector = new Vector<Object>();
private static Stack<Object> stack = new Stack<Object>();
public static void main(String[] args) {
System.out.println("....开始测试插入元素..........");
// 插入元素测试
insertData(arrayList,"ArrayList") ;
insertData(linkedList,"LinkedList") ;
insertData(vector,"Vector") ;
insertData(stack,"Stack") ;
System.out.println("....开始测试读取元素..........");
// 随机读取元素测试
readAccessData(arrayList,"ArrayList") ;
readAccessData(linkedList,"LinkedList") ;
readAccessData(vector,"Vector") ;
readAccessData(stack,"Stack") ;
System.out.println("....开始测试删除元素..........");
// 随机读取元素测试
deleteData(arrayList,"ArrayList") ;
deleteData(linkedList,"LinkedList") ;
deleteData(vector,"Vector") ;
deleteData(stack,"Stack") ;
}
/**
* 指定的List 的子类中插入元素,并统计插入的时间
* @param list List 的子类
* @param name 子类的名称
*/
private static void insertData(List<Object> list,String name) {
long startTime = System.currentTimeMillis();
// 向list的位置0插入COUNT个数
for (int i=0; i<COUNT; i++){
list.add(0, i);
}
long endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println(name + " : 插入 "+COUNT+"元素, 使用的时间是 " + interval+" ms");
}
/**
* 指定的List 的子类中删除元素,并统计删除的时间
* @param list List 的子类
* @param name 子类的名称
*/
private static void deleteData(List<Object> list,String name) {
long startTime = System.currentTimeMillis();
// 删除list第一个位置元素
for (int i=0; i<COUNT; i++)
list.remove(0);
long endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println(name + " : 删除 "+COUNT+"元素, 使用的时间是 " + interval+" ms");
}
/**
* 指定的List 的子类中读取元素,并统计读取的时间
* @param list List 的子类
* @param name 子类的名称
*/
private static void readAccessData(List<Object> list,String name) {
long startTime = System.currentTimeMillis();
// 读取list元素
for (int i = 0; i < COUNT; i++)
list.get(i);
long endTime = System.currentTimeMillis();
long interval = endTime - startTime;
System.out.println(name + " : 随机读取 "+COUNT+"元素, 使用的时间是 " + interval+" ms");
}
}
运行结果:
当然电脑的性能也会影响该时间,但是结果是显而易见的。
从运行的结果可以看出,ArrayList和LinkedLis适用各自的场景中!
为什么ArrayList读取速度快于LinkedList,而插入和删除速度又慢于LinkedList?
有兴趣的可以研究下他们各自的源码,这里就不过多做分析了。
网友评论