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. 电商安全无小事,如何有效抵御 CSRF 攻击?

    现在,我们绝大多数人都会在网上购物买东西.但是很多人都不清楚的是,很多电商网站会存在安全漏洞.乌云就通报过,国内很多家公司的网站都存在 CSRF 漏洞.如果某个网站存在这种安全漏洞的话,那么我们在购物 ...

  2. class 类组件:

    ES6  中的class 类组件: // class 关键字:确定一个类型student以类的概念存在 class student{ //构造函数 是默认自动执行 // 初始化 name age 属性 ...

  3. Mariadb之日志相关配置

    前面我们聊到了mariadb的事务,以及事务隔离级别,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13198186.html:今天我们来聊一聊mariadb的 ...

  4. MFC文档视图中窗口切换 (2012-05-11 18:32:48)

    在文档试图应用程序,有时需要在工作区切换试图,以下就是如何切换试图了 .创建要切换的视图类,同时把构造函数,Create函数改变为public .在需要切换试图的动作响应中,加入切换代码,一般是在CM ...

  5. 【必读】前端需要懂的 APP 容器原理

    App 容器,简言之,App 承载某类应用(H5/RN/Weex/小程序/Flutter ...)的运行环境,可主动干预并进行功能扩展,达到丰富能力.优化性能.提升体验的目的,如页面数据预取(pref ...

  6. Tornado之异步非阻塞

    同步模式:同步模式下,只有处理完前一个任务下一个才会执行 class MainHandler(tornado.web.RequestHandler): def get(self): time.slee ...

  7. 一个神奇的SQL语句

    题目是这样的: 分别往这两张表中添加3条数据... 查询营业额最高商家的商品总价与营业额最低商家的商品总价差是多少(5分)CREATE VIEW vm2 AS SELECT price*limit_n ...

  8. SpringMvc流程分析,简单源码分析

    SpringMvc的请求入口:web.xml中的DispatcherServlet <servlet> <servlet-name>springServlet</serv ...

  9. 【Java8新特性】冰河带你看尽Java8新特性,你想要的都在这儿了!!(文本有福利)

    写在前面 很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢.好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助 ...

  10. C++中string转换为char*类型返回后乱码问题

    问题来源: 在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root)  其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使 ...