这一章节我们来讨论一下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,以及对两者进行一次简单的性能测试。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
从头写React-like框架的工程搭建实现 最近在网上看到了 Build your own React 这篇文章,作者从零开始实现了一个简易类 React 框架,虽然没有过多的优化,但 React 中的核心思想 Concurrent Mode,Fiber ...
java实现验证码功能源码 Java Periphery 是一个高性能库,用于用户空间 Linux 中的 GPIO、LED、PWM、SPI、I2C、MMIO 和串行外设 I/O 接口访问。 我没有尝试从头开始构建它并生成 JNI 包装器。 这节省了大量手动编码...
从头开始学习Java课程-资料来源PillsInformática。
Java-3D游戏引擎与基本游戏Java中使用LWJGL,OpenGL,OpenAL等的3D游戏引擎。 从头开始
视频 https://www.bilibili.com/video/BV1914y1s7hi
视频 https://www.bilibili.com/video/BV1914y1s7hi
军工行业2021年度投资策略:而今迈步从头越-20201115-招商证券.pdf
赖世雄英语从头学 下载-附件资源
外卖订餐java源码 你会学到什么 通过 Java 片段的构建块,您将能够立即了解 Java 编程的要点。 你需要什么 勇敢地浏览存储库! 或替代开源 JDK 1.8 版本 截至今天,该存储库已通过测试 Oracle JDK 1.8 OpenJDK 1.8 ...
本资料是UCSF DOCK的使用案例分享的输入资料,将使用DOCK 6.11自带的片段库,使用DOCK/RDKit的 DOCK_D3N功能从头设计分子。便于使用者直接从这部分设计工作开始,不需花时间来准备输入文件。
Java多线程与线程安全实践-基于Http协议的断点续传.rar 是一个Java毕业设计项目,旨在探讨如何在Java中实现多线程下载和断点续传功能,同时确保线程安全。该项目的主要特点如下: 1. 多线程下载:项目采用了Java的...
乙二醇2020年度策略报告:“熊”关漫道真如铁,而今迈步从头越-20191230-光大期货-36页.rar
开发人员零java-Mentorama 在此存储库中,将从头开始插入Java Developer模块的Mentorama课程期间开发的所有练习。
3D游戏从头编-网上收集,很基础. 第一回:开发环境 第二回:3D基本概念 第三回:第一个D3D程序 第四回:渲染顶点 第五回:渲染索引顶点 第六回:摄象机 第七回:灯光 第八回:纹理 第九回:3D模型(.x)
java源码字符串缓冲区 这是 Java String 、 StringBuilder和StringBuffer方法/API 的完整指南。 本指南的源代码示例在我们的本地开发环境中进行了良好的测试,您可以将这些示例用作无错误。 您可以在 上了解更多信息...
Java机器人 这是一个从头开始编写JavaScript机器人
如果您了解一点C或JavaScript,本指南就是从头开始学习Java。 这是一个正在进行的工作,应该在下一个Java LTS(Java 17)发布时准备就绪。 所有代码都在启用预览功能的Java 14上运行。 注意:如果您只希望查看...
Java-TCP-GUI-聊天 介绍 作为我的理学学士学位的交流课程的一个项目,我被要求制作一个聊天应用程序。 我完全是从头开始制作此程序的,没有从其他来源复制任何功能。 我知道代码不是很完美,但是在我还承担其他学术...
2021年宏观经济与资-市场展望:从头越-20201201精品报告2020.pdf
Java系列13-Spring Boot 实际上,我们将从头开始逐步开发项目。 我们将详细检查Spring Boot开发环境和体系结构。 借助Spring Boot,我们将探索公司Java项目的基础架构。 您可以通过Spring Framework为自己带来美好的...