java集合系列——List集合总结 还不学吗?

在编程过程中,会很频繁的使用集合,集合的相关知识也非常重要,也是每一个开发人员必须掌握的知识。
一:集合的概念
集合:保存数量不确定的数据,以及保存具有映射关系的数据的容器,简单的理解就是用于存储数量不等的多个对象的容器。
集合和数组不一样,数组元素既可以是基本类型的值,也可以是对象(对象的引用变量);而集合里只能保存对象(对象的引用变量)。
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;

/**

  • Title: ListTest

  • Description:

  • Company: westlife

  • @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?
有兴趣的可以研究下他们各自的源码,这里就不过多做分析了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值