您的位置:首页 > 编程语言 > Java开发

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

2015-11-17 23:36 691 查看
这一章节我们来讨论一下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