JAVA集合一:ArrayList和LinkedList

参考链接:

HOW2J.CN

前言

这几篇博客重点记录JAVA的几个重要的集合框架:ArrayList、LinkedList、HashMap、HashTable和HashSet。主要从ArrayList和LinkedList、HashMap和HashTable的区别,以及各集合框架的使用等方面进行记录。本篇博客介绍ArrayList和LinkedList的使用和区别。

ArrayList和LinkedList的区别和使用

ArrayList实现了List接口,以下是它的主要方法:

常用方法 用途
add 在当前顺序表末尾插入一个元素
insert 在当前顺序表中插入一个元素
remove 删除指定元素
indexOf 获取某个元素的下标
size 获取顺序表的大小
contains 判断是否存在某个元素
get 获取指定下标的元素
set 替换指定下标的元素
clear 清除顺序表所有元素
addAll 将另一个容器的所有元素添加进来
toArray 将顺序表转化为数组

LinkedList同样实现了List接口, add,remove,contains 等方法同样可以使用。除此之外,它还实现了Deque接口(双向链表)和Queue接口(队列),以下是它区别于ArrayList的特殊的方法:

特殊方法 用途
addLast 在末尾插入元素
addFirst 在首部插入元素
getFirst 获取首部元素
getLast 获取尾部元素
removeFirst 删除首部元素
removeLast 删除尾部元素
offer 元素进入队列尾部
poll 从队列首部取出一个元素
peek 查看队列第一个元素(不取出)

ArrayList就是数据结构中学习的顺序表,查询方便,增删较慢

LinkedList就是数据结构中学习的链表,查询较慢,增删很快

以下是how2j网站对两种数据结构的示意图:

接下来我们用代码来展示两者的区别:

//向ArrayList和LinkedList最前面添加10000个数据

package blog;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; public class Main {
public static void main(String[] args) {
List<Integer> arr = new ArrayList<Integer>();//顺序表
List<Integer> link = new LinkedList<Integer>();//链表
insertFirst(arr, "顺序表");
insertFirst(link, "链表");
} //在线性表头部插入10000个数据,计算耗时
public static void insertFirst(List list, String name) {
int num = 10000;
int data = 1;
long start = System.currentTimeMillis();//获取开始时间
for(int i = 0; i < num; i++) {
list.add(0,data);
}
long end = System.currentTimeMillis();//获取结束时间
System.out.format("在%s头部插入10000个数据,耗时 %d ms\n", name,(end-start));
}
}

运行结果如下(链表耗时更少,因为头部基本不需要定位,只需要增删):

在顺序表头部插入10000个数据,耗时 15 ms

在链表头部插入10000个数据,耗时 2 ms

//ArrayList和LinkedList查询某个元素耗时
package blog; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; public class Main {
public static void main(String[] args) {
List<Integer> arr = new ArrayList<Integer>();//顺序表
List<Integer> link = new LinkedList<Integer>();//链表
getIndex(arr, "顺序表", 500000);
getIndex(link, "链表", 500000);
} //在线性表获取第index位的数据,计算耗时
public static void getIndex(List<Integer> list, String name, int index) {
int num = 1000000;
for(int i = 0; i < num; i++) {
list.add(i);
}
long start = System.currentTimeMillis();//获取开始时间
int target = list.get(index);//查询元素下标
long end = System.currentTimeMillis();//获取结束时间
System.out.format("在%s中寻找下标为 %d 的数据,耗时 %d ms\n", name,target,(end-start));
}
}

结果如下(当表中数据极大时,链表查询缓慢的多):

在顺序表中寻找下标为 500000 的数据,耗时 0 ms

在链表中寻找下标为 500000 的数据,耗时 5 ms

JAVA集合一:ArrayList和LinkedList的更多相关文章

  1. 深入理解java中的ArrayList和LinkedList

    杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...

  2. java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

    说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...

  3. Java集合(六)--ArrayList、LinkedList和Vector对比

    在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读 ...

  4. Java集合之ArrayList和LinkedList的实现原理以及Iterator详解

    ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...

  5. Java进阶(十七)ArrayList与LinkedList的区别

    ArrayList与LinkedList的区别 ArrayList ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayLis ...

  6. Java: Difference between ArrayList and LinkedList

    Basically, they are just two different implementations of List interface. LinkedList is implemented ...

  7. Java集合一

    java的集合类主要由两个接口派生而出:Collection && Map 这两个接口是集合框架的根接口 Collection----直接派生:Set(无序集合,元素不可重复) Lis ...

  8. java中的ArrayList 、List、LinkedList、Collection关系详解

    一.基础介绍(Set.List.Map) Set(集):集合中的元素不按特定方式排序,并且没有重复对象.他的有些实现类能对集合中的对象按特定方式排序. List(列表):集合中的元素按索引位置排序,可 ...

  9. Java集合:List、Set和Map的区别,ArrayList和LinkedList有何区别..........

    一.数组和集合的区别: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型): 集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! J ...

随机推荐

  1. C++ 公有继承、保护继承和私有继承的对比

    在c++的继承控制中,有三种不同的控制权限,分别是public.protected和private.定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类是默认public ...

  2. Merge,Rebase,Cherry-Pick 一文解惑

    代码合并在日常开发中是较为常见的场景,采用合适的合并方式,可以起到事半功倍的效果.对应在 Git 中合并的方式主要有三个,Merge,Rebase,Cherry-Pick. 开始部分会首先介绍一下这三 ...

  3. Python3-hashlib模块-加密算法之安全哈希

    Python3中的hashlib模块提供了多个不同的安全哈希算法的通用接口 hashlib模块代替了Python2中的md5和sham模块,使用这个模块一般分为3步 1.创建一个哈希对象,使用哈希算法 ...

  4. JavaScript基础对象创建模式之静态成员(027)

    在支持“类”的面向对象语言中,静态成员指的是那些所有实例对象共有的类成员.静态成员实际是是“类”的成员,而非“对象”的成员.所以如果 MathUtils类中有个叫 max()的静态成员方法,那么调用这 ...

  5. 为DLL文件添加强名称

    程序在编译时出现类似 "错误 1 程序集生成失败 -- 引用的程序集“XXXXXXXXXX”没有强名称" 这样的错误,是因为它不是强名称的,则需要进行以下操作: 例如:com.so ...

  6. Fiddler和JMeter测试需要主要的地方

    Fiddler里面设置请求头的时候ContentType和Content-Type这两种写法都可以: 这两种写法都可以. 但是在JMeter中必须要用Content-Type才行,如下图所示: (完)

  7. python基础--自定义模块、import、from......import......

    自定义模块.import.from......import...... 1)模块的定义和分类 1.模块是什么? 我们知道一个函数封装了一个功能,软件可能是有多个函数组成的.我们说一个函数就是一个功能, ...

  8. unicode键盘编码表

    键盘uniCode编码 功能键:       8 ==>   Backspace             9 ==>   Tab             12==>   Clear ...

  9. JVM源码分析之Java对象头实现

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Java对象头实现 HotSpot虚拟机中,对象在内存中的布局分为三 ...

  10. sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

    1.首先,问题出现的点是在泛型 我出现问题的原因是,和泛型有关系,要调整泛型 2.我把问题出现的过程描述一哈子 1.基础类 @tk.mybatis.mapper.annotation.Register ...