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要移动 ...
随机推荐
- Twisted No module named win32api
安装twisted成功后,使用时抛错: No module named win32api 解决方案,需要安装 pywin32 下载地址: https://sourceforge.net/project ...
- 常用js表单文本域验证
1.验证是否为正确的邮箱地址 注意:本方法只能验证以@a.b结尾的邮箱地址,对于三级及三级以上的邮箱,比如@iie.ac.cn结尾的会出现错误 function isEmail(o){ var reg ...
- python 学习笔记 9 -- Python强大的自省简析
1. 什么是自省? 自省就是自我评价.自我反省.自我批评.自我调控和自我教育,是孔子提出的一种自我道德修养的方法.他说:“见贤思齐焉,见不贤而内自省也.”(<论语·里仁>)当然,我们今天不 ...
- Linux中的那些英文缩写和她的含义们
系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Print working directory 打印工作路径. su:Swith user 切换用户,切换到roo ...
- python 连接数据库-设置oracle ,mysql 中文字符问题
import cx_Oracle import MySQLdb def conn_oracle(): cnn = cx_Oracle.connect('用户名','密码','ip:端口号/数据库') ...
- redmine和svn server的部署
作为一个程序猿,想要很好的管理自己项目和代码,我们需要一些工具做辅助. 项目管理工具redmine和代码版本管理工具 SVN(Subversion). 我们选择在虚拟机里面安装windows部署这两套 ...
- Oracle EBS-SQL (SYS-20):职责使用菜单2.sql
select frt.responsibility_name, fr.menu_id, fm.menu_name, fr.request_group_i ...
- linux关闭防火墙方法
在关闭防火墙之前需要查看防火墙的状态,可以使用service iptables status命令来查看,确定防火墙是否开启再来进行关闭操作. 如果想临时开启防火墙使用命令service iptable ...
- poj1969---找规律
题意:按照s型分别给数编号,给 #include <stdio.h> #include <stdlib.h> int main() { int n; while(scanf(& ...
- Objective-C时间戳转换的转换和时间
什么是时间戳? 时间戳(timestamp),一般是一个字符序列.唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用. 思考:简单来讲就是依据文件hash加密后生成的摘要和时间生成的时 ...