zoukankan      html  css  js  c++  java
  • 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很多,明显不是在一个数量级上

  • 相关阅读:
    4.2. 入门案例
    4.1. Scrapy配置安装
    4. Scrapy框架
    2.6. 案例:使用BeautifuSoup4的爬虫
    2.03_01_Python网络爬虫urllib2库
    2.06_Python网络爬虫_正则表达式
    2.04_Python网络爬虫_Requests模块
    2.03_Python网络爬虫Http和Https
    TCP协议的三次握手
    从零开始搭建VUE项目
  • 原文地址:https://www.cnblogs.com/riskyer/p/3253660.html
Copyright © 2011-2022 走看看