JAVA集合一:ArrayList和LinkedList
参考链接:
前言
这几篇博客重点记录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
", 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
", name,target,(end-start));
}
}
结果如下(当表中数据极大时,链表查询缓慢的多):
在顺序表中寻找下标为 500000 的数据,耗时 0 ms
在链表中寻找下标为 500000 的数据,耗时 5 ms