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网站对两种数据结构的示意图:

JAVA集合一:ArrayList和LinkedList-LMLPHP

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

//向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));
}
}

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

//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));
}
}

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

05-11 20:30