从头认识java-9.4 List的简介与性能

原创 2015年11月17日 23:36:29

这一章节我们来讨论一下List里面的两个常用的容器ArrayList和LinkedList。

1.相同之处

两个list都是具有顺序的序列

2.不同之处

ArrayList善于执行查询操作,但是插入操作性能不好

LinkedList善于在中间插入元素,但是查询的性能不好。

3.演示List的一些常用方法

package com.ray.ch09;

import java.util.ArrayList;

public class Test {
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add(i);
		}
		System.out.println(list.get(3));
		System.out.println(list.indexOf(5));
		list.remove(list.indexOf(3));
		for (Integer param : list) {
			System.out.println(param);
		}
		ArrayList<Integer> list2 = new ArrayList<Integer>();
		list2.add(5);
		list.retainAll(list2);
		for (Integer param : list) {
			System.out.println(param);
		}
		list2.clear();
		list.clear();
	}
}

 

--------------------------------分割线--------------------------------------

下面是扩展内容


4.测试性能

因为上面教科书说了ArrayList善于查询,LinkedList善于插入,那么我们下面来做两个实验

(1)插入元素的性能测试

代码:

package com.ray.ch09;

import java.util.ArrayList;
import java.util.LinkedList;

public class Test {
	public static void main(String[] args) {
		long amount = 10000;// 随时改变这个插入元素的个数
		long startTime = System.currentTimeMillis();
		ArrayList<Double> arrayList = new ArrayList<Double>();
		for (long i = 0; i < amount; i++) {
			arrayList.add(Math.ceil(i / 2));
		}
		long endTime = System.currentTimeMillis();
		System.out.println("ArrayList:" + (endTime - startTime));
		System.gc();
		System.out.println("------------------------------");
		startTime = System.currentTimeMillis();
		LinkedList<Double> linkedList = new LinkedList<Double>();
		for (long i = 0; i < amount; i++) {
			linkedList.add(Math.ceil(i / 2));
		}
		endTime = System.currentTimeMillis();
		System.out.println("LinkedList:" + (endTime - startTime));
	}
}


 

我们上面的代码是在list的中间插入一个元素。

我们通过几个级别来测试:

amount=10000的输出:

ArrayList:16
------------------------------
LinkedList:0


amount=100000的输出:(大部分的时候是下面的结果)

ArrayList:31
------------------------------
LinkedList:15

 

amount=500000的输出:(出现逆转)

ArrayList:125
------------------------------
LinkedList:219

 

amount=5000000的输出:(出现逆转)

ArrayList:1953
------------------------------
LinkedList:2078

 

amount=9000000的输出:(linkedlist耗尽内存)

ArrayList:3375
------------------------------

java.lang.OutOfMemoryError

 

综上所述:LinkedList在数据规模较小的,插入的性能的确比ArrayList要来的好,但是,中间出现了转折点,当数据达到一定程度,LinkedList插入的性能竟然比ArrayList要低,而且当数量更大时,LinkedList耗尽内存抛异常,LinkedList比ArrayList要来到耗内存,因为他使用链式存储,存储的数据比ArrayList要多。

 

(2)查看元素

代码:

package com.ray.ch09;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Random;

public class Test {
	public static void main(String[] args) {
		long amount = 1000000;// list的大小
		int times = 1000;// 查看次数
		ArrayList<Double> arrayList = new ArrayList<Double>();
		for (long i = 0; i < amount; i++) {
			arrayList.add(Math.ceil(i / 2));
		}
		LinkedList<Double> linkedList = new LinkedList<Double>();
		for (long i = 0; i < amount; i++) {
			linkedList.add(Math.ceil(i / 2));
		}
		System.out.println("===========查看测试开始===========");
		Random random = new Random();
		long startTime = System.currentTimeMillis();
		for (int i = 0; i < times; i++) {
			arrayList.get(random.nextInt(times));
		}
		long endTime = System.currentTimeMillis();
		System.out.println("ArrayList:" + (endTime - startTime));
		startTime = System.currentTimeMillis();
		for (int i = 0; i < times; i++) {
			linkedList.get(random.nextInt(times));
		}
		endTime = System.currentTimeMillis();
		System.out.println("LinkedList:" + (endTime - startTime));
	}
}


我们先在两个list里面存放1000000个元素,然后进行随机查询。

 

times=1000时的输出:

===========查看测试开始===========
ArrayList:0
LinkedList:16

 

times=10000时的输出:

===========查看测试开始===========
ArrayList:0
LinkedList:969

 

times=100000时的输出:

===========查看测试开始===========
ArrayList:0
LinkedList:等不了的那么久

 

事实证明,linkedLIst的查询性能非常差,ArrayList的非常好。

 

总结:这一章节我们主要讲述了LinkedList和ArrayList,以及对两者进行一次简单的性能测试。

 

这一章节就到这里,谢谢。

-----------------------------------

目录

 


 

 

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA中List应用简介

将1~100之间的所有正整数存放在一个List集合中, 并将集合中索引位置是10的对象从集合中移除。 package com.han; import java.util.*; /** * ...
  • Gaowen_HAN
  • Gaowen_HAN
  • 2012年01月02日 05:11
  • 1268

从头认识java-9.4 List的简介与性能

这一章节我们来讨论一下List里面的两个常用的容器ArrayList和LinkedList。1.相同之处两个list都是具有顺序的序列2.不同之处ArrayList善于执行查询操作,但是插入操作性能不...
  • raylee2007
  • raylee2007
  • 2015年11月17日 23:36
  • 2072

java的List类

集合的体系:   ------------| Collection 单例集合的根接口 ----------------| List  如果是实现了List接口的集合类,具备的特点: 有序,可重复...
  • oguro
  • oguro
  • 2016年11月30日 21:39
  • 351

从头认识java-17.1 多线程

这一章节我们来讨论一下多线程。1.什么是多线程?多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于...
  • raylee2007
  • raylee2007
  • 2016年01月10日 08:39
  • 1201

DataTable比List读取的性能高很多;

DataTable比List读取的性能高很多;
  • xiexuzhao
  • xiexuzhao
  • 2016年12月22日 13:57
  • 458

List集合底层实现

1.List: List实现Collection接口,它的数据结构是有序可以重复的结合,该结合的体系有索引;它有三个实现类:ArrayList、LinkList、Vector三个实现类; 三个实现...
  • JAVA_Admin_User
  • JAVA_Admin_User
  • 2016年09月20日 09:15
  • 11232

java基础之集合函数-List

1 集合List(1)List: 有顺序的,元素可以重复 (2)概念:List是一个接口,不能实例化,需要实例化ArrayList或LinkedList (3)排序:Comparable Com...
  • chenliguan
  • chenliguan
  • 2015年07月28日 20:25
  • 1839

ArrayList的使用和List<T>的比较

使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序利用 .NET Framework 基类库中的 ArrayList 集合类。ArrayList 是一个使用起来非常方便的集合类,无需进行修...
  • sujing910206
  • sujing910206
  • 2012年07月04日 11:39
  • 5152

redis 消息队列性能测试

redis 消息队列redis 阻塞listlpush key value1 value2 .. brpop key 0 测试环境 ubuntu 机器双核4G内存普通机 外网流量4M redis版本:...
  • jia281460530
  • jia281460530
  • 2016年12月16日 17:51
  • 1578

java集合系列——List集合之LinkedList介绍(三)

LinkedList是基于链表实现的,从源码可以看出是一个双向链表。除了当做链表使用外,它也可以被当作堆栈、队列或双端队列进行操作。不是线程安全的,继承AbstractSequentialList实现...
  • u010648555
  • u010648555
  • 2017年02月28日 22:12
  • 857
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从头认识java-9.4 List的简介与性能
举报原因:
原因补充:

(最多只允许输入30个字)