ArrayList和LinkedList的各项操作性能比较
如果用java编写程序,我们通常存储易变的数据集合时用到的数据结构往往是ArrayList,不过,在JDK中还存在另一个结构--LinkedList,只不过我们通常不用,原因在于性能问题,下面,我就以一个问题来分析下这两个结构的性能差别。
问题:
自己编写一个测试程序,测试验证ArrayList和LinkedList在做增、删、改、遍历等操作上的性能差异。
首先,我先给出ArrayList的测试类:
package com.brucezhang.arraylinkedtest;
import java.util.ArrayList;
public class My_ArrayList_Test {
//定义循环次数常量
private static final int count = 100000;
//定义ArrayList
private ArrayList<Integer> my_array = new ArrayList<Integer>();
//存数据进ArrayList--增
public void addToArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < count; i++){
my_array.add(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.add()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
//删除数据从ArrayList--删
public void delFromArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_array.size(); i++){
my_array.remove(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.remove()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
//修改ArrayList中的数据--改
public void updateArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_array.size(); i++){
my_array.set(i, i+1);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.set()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
//查询ArrayList中的数据--查
public void selFromArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_array.size(); i++){
my_array.get(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.get()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
}
下面,给出的是LinkedList的测试类:
package com.brucezhang.arraylinkedtest;
import java.util.LinkedList;
public class My_LinkedList_Test {
//定义循环次数常量
private static final int count = 100000;
//定义LinkedList
private LinkedList<Integer> my_link = new LinkedList<Integer>();
//存入数据进LinkedList--增
public void addToLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < count; i++){
my_link.add(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.add()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
//删除数据从LinkedList--删
public void delFromLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_link.size(); i++){
my_link.remove(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.remove()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
//修改LinkedList中的数据--改
public void updateLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_link.size(); i++){
my_link.set(i, i+1);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.set()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
//查询LinkedList中的数据--查
public void selFromLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_link.size(); i++){
my_link.get(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.get()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
}
好了,最后给出主测试程序:
package com.brucezhang.arraylinkedtest;
public class Main_Class {
/**
* @param args
* Author:DlutBruceZhang
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//测试ArrayList的各项操作
ArrayTest();
//测试LinkedList的各项操作
LinkTest();
}
public static void ArrayTest(){
System.out.println("--------------------------------------------------");
My_ArrayList_Test arrayTest = new My_ArrayList_Test();
arrayTest.addToArray();
arrayTest.updateArray();
arrayTest.selFromArray();
arrayTest.delFromArray();
System.out.println("--------------------------------------------------");
}
public static void LinkTest(){
System.out.println("--------------------------------------------------");
My_LinkedList_Test linkTest = new My_LinkedList_Test();
linkTest.addToLink();
linkTest.updateLink();
linkTest.selFromLink();
linkTest.delFromLink();
System.out.println("--------------------------------------------------");
}
}
测试的结果如下所示:
--------------------------------------------------
操作 ArrayList.add()方法需要的时间是:9 毫秒
操作 ArrayList.set()方法需要的时间是:7 毫秒
操作 ArrayList.get()方法需要的时间是:4 毫秒
操作 ArrayList.remove()方法需要的时间是:1311 毫秒
--------------------------------------------------
--------------------------------------------------
操作 LinkedList.add()方法需要的时间是:9 毫秒
操作 LinkedList.set()方法需要的时间是:8715 毫秒
操作 LinkedList.get()方法需要的时间是:8700 毫秒
操作 LinkedList.remove()方法需要的时间是:6672 毫秒
--------------------------------------------------
由结果我们可以得出结论:
1.两个结构在存储数据方面所用时间没有太大的区别
2.两个结构在更改,查询,删除结构中的数据时性能差别“巨大”,且ArrayList优于LinkedList很多,明显不是在一个数量级上
ArrayList和LinkedList的各项操作性能比较的更多相关文章
- ArrayList vs LinkedList vs Vector
List概览 List,正如它的名字,表明其是有顺序的.当讨论List的时候,最好拿它跟Set作比较,Set中的元素是无序且唯一:下面是一张类层次结构图,从这张图中,我们可以大致了解java集合类的整 ...
- 【转】ArrayList与LinkedList的区别和适用场景
ArrayList 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的). 缺点:因为地址连续,当要插入和删除时,Arra ...
- Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)
Java基础之 集合体系结构详细笔记(Collection.List.ArrayList.LinkedList.Vector) 集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就 ...
- 深入理解java中的ArrayList和LinkedList
杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...
- ArrayList,Vector,LinkedList
在java.util包中定义的类集框架其核心的组成接口有如下:·Collection接口:负责保存单值的最大父接口 |-List子接口:允许保存重复元素,数据的保存顺序就是数据的增加顺序: |-Set ...
- Java数据结构之表的增删对比---ArrayList与LinkedList之一
一.Java_Collections表的实现 与c不同Java已经实现并封装了现成的表数据结构,顺序表以及链表. 1.ArrayList是基于数组的实现,因此具有的特点是:1.有索引值方便查找,对于g ...
- C++模拟实现JDK中的ArrayList和LinkedList
Java实现ArrayList和LinkedList的方式采用的是数组和链表.以下是用C++代码的模拟: 声明Collection接口: #ifndef COLLECTION_H_ #define C ...
- ArrayList与LinkedList用法与区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedLis ...
- ArrayList 和 LinkedList 的区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动 ...
随机推荐
- php 封装Mysql数据库操作类
花了点时间写了个基于php5.3的Mysql类 $mysql = new Mysql('host','user','pass','db') bool Mysql::insert("表&quo ...
- Nginx修改配置实现图片防盗链
一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...
- System.DateTime的一些格式
//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.To ...
- 对web应用中单一入口模式的理解及php实现
在我们web应用的开发中,经常会听见或看见单一入口模式,在我开始学习tp框架的时候也不理解为什么要运用一个单一入口模式,只是会使用,最近自己在搞一个小东西的时候才明白为什么在web开发中要运用单一入口 ...
- Oracle EBS-SQL (GL-3):从总帐追溯到发票
SELECT je_header_id, je_line_num, trx_class_name, trx_type_name, trx_number_displayed, trx_date,comm ...
- WPF中的触发器简单总结
原文 http://blog.sina.com.cn/s/blog_5f2ed5cb0100p3ab.html 触发器,从某种意义上来说它也是一种Style,因为它包含有一个Setter集合,并根据一 ...
- poj1656---数黑格子
题意:有white,black,test操作 black将给定范围涂黑,white将给定范围涂白,test将给定范围的黑格子数出来并且输出 思路:无论哪个操作格子范围都在 (x,y) (x+L-1 ...
- [LeetCode][Python]Add Two Numbers
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/add-two ...
- 分析Ext2文件系统结构。
1. 目的 分析Ext2文件系统结构. 使用 debugfs 应该跟容易分析 Ext2文件系统结构 了解ext2的hole的 2. 准备工作 预习文件系统基本知识: http://www.doc88. ...
- 『HTML5梦幻之旅』-缤纷多姿的烟花效果
天花无数月中开,五采祥云绕绛台.堕地忽惊星彩散,飞空旋作雨声来.怒撞玉斗翻晴雪,勇踏金轮起疾雷.更漏已深人渐散,闹竿挑得彩灯回. ——明·瞿佑·<烟火戏> 记得每年过春节的那段时间,除了欣 ...