JAVA集合一:ArrayList和LinkedList

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

posted @ 2019-10-17 15:32  衍射  阅读(97)  评论(0编辑  收藏  举报