这一章节我们来讨论一下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,以及对两者进行一次简单的性能测试。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
标签 "jar" 和 "java" 明确了这个文件与Java编程语言和JAR文件格式的关系。Java开发者经常使用JAR文件来分发和部署他们的软件,因为它们可以作为一个单元被导入到其他项目中,或者作为独立的应用程序运行。JAR文件还...
用户可以轻松地导入现有的Java项目,或者从头开始创建新的项目,包括Maven或Gradle构建系统。 3. **构建工具**:Eclipse 集成了构建工具,如Ant和Maven,使得构建和管理项目依赖变得简单。对于现代Java开发,Maven...
在标签中,“ntrip__java实现”表明这个客户端是用Java编程语言编写的,这是Android应用开发的常见选择,因为Java与Android SDK兼容性良好。“ntrip_android_client”和“ntrip_client”则明确了这是一个面向Android...
标签 "aip sdk" 进一步确认了这是一个与百度AIP相关的SDK,通常这样的SDK会提供一系列预先封装好的接口,使得开发者可以快速地在自己的项目中集成AI功能,而无需从头开始编写复杂的算法和模型。 在压缩包的文件名称...
List接口是Java集合框架中的核心接口之一,它继承自Collection接口,并具有特定的特性:元素可以重复,保持元素的顺序,并允许对元素的位置进行精确控制。List接口有多个实现类,包括ArrayList、LinkedList、Vector...
【标题】: "手把手 - 微服务 Windows 开发环境从头搭建 2022-09-05 直播录像 - 软件安装包-2.zip" 这个压缩包文件包含了搭建微服务开发环境所需的基础软件,包括JDK(Java Development Kit)和MySQL数据库。...
【标题】"Aspose.Words for Java 23.6 with JDK 17 Support" Aspose.Words 是一个强大的文档处理库,专为Java开发者设计,用于创建、操作和转换各种文档格式。版本23.6是这个库的一个重要更新,它引入了对Java ...
### Java应用:两种Java容器类List和Set分析 #### 一、概述 在Java编程语言中,集合框架(Collections Framework)是处理数据的核心组件之一,它提供了存储和操作对象的各种方式。本文将深入探讨Java中的两种重要...
4. **安全性与性能优化** - **限制文件大小**:为了避免大文件上传导致服务器资源耗尽,可以设定上传文件的大小限制。 - **文件重命名**:为了防止文件名冲突和安全问题,上传的文件应该用唯一的ID或者时间戳进行...
Java提供了两种内置的LookAndFeel:Metal(默认的Java Look and Feel)和SystemLookAndFeel,后者可以使Swing组件看起来与宿主操作系统(如Windows、Mac OS X或Linux)的原生控件一致。此外,开发者还可以自定义Look...
根据给定文件的信息,我们可以提炼出关于Java软件开发中List接口实现类的关键知识点。这部分内容主要聚焦于第11章的“Java集合框架和泛型机制”,特别关注List接口及其几种实现类,包括`ArrayList`、`LinkedList`、`...
"java-lib"是一个与Java编程相关的资源集合,很可能包含了各种常用的Java库,这些库可以帮助开发者在进行Java开发时提高效率,解决特定问题。"java-all-lib"的标签可能表示这个压缩包包含了广泛的Java库,涵盖了多种...
Java是一种广泛使用的面向对象的编程语言,其特点包括抽象、继承、封装和多态性。在Java笔试中,这些概念经常被考察。 1. **面向对象的特征**: - **抽象**:抽象是将复杂问题简化的过程,分为过程抽象(方法)和...
Java SDK是许多软件开发中的重要组成部分,特别是在与服务器端交互时。在这个名为"java-sdk-master.zip"的压缩包中,包含的是Leancound的Java SDK,这是一个专为集成Leancound服务而设计的开发工具包。Leancound是...
【标题】:“curso-java-pildorasInf:从头开始学习Java” 这门“从头开始学习Java”的课程,源自"PillsInformática"的教育资源,旨在为初学者提供全面的Java编程知识。Java是一种广泛使用的面向对象的编程语言,由...
【标签】"Java" 表明这个库是专门为 Java 语言设计的,与 Java 语法兼容,并且可以在 Java 虚拟机(JVM)上运行。这意味着它可能使用了 Java 核心库中的接口和类,并且遵循了 Java 的编程规范。对于 Java 开发者来说...
在Java开发中,创建具有模糊效果的视图背景可以提升应用程序的用户体验,使其看起来更加现代和精致。"使用渲染脚本实现模糊视图背景"是一个常见的技术实践,它通常涉及到图形处理和用户界面的设计。在这个项目中,...
7. 与其他格式互转:支持PDF与XML、TXT、图片等格式的转换。 以上就是`java-pdf&word-jar.zip`压缩包中涉及到的Java库的关键功能和应用场景。开发者可以结合这些库,轻松地在Java程序中实现对PDF和Word文档的高效...
**Free Spire.Doc for Java - 3.9 无水印** `Free Spire.Doc for Java` 是一款专为Java开发者设计的文档处理库,它允许用户在Java应用程序中创建、编辑和转换Microsoft Word文档。这个3.9版本提供的是无水印版本,...