在Java中,关于集合框架有这样一个体系结构:
其主要由两个接口派生而出:Collection和Map,然后再衍生出各自的一些实现类(比如Collection接口又被继承与Set和List接口,而他们各自又实现了具体的类)。

今天我就简要分析一下,实现List的两个类(ArrayList和LinkedList),他们的区别是什么,我们在使用过程中有哪些注意事项。

区别

首先最显要的区别就是,他们的底层结构完全不同,ArrayList底层实现是数组,LinkedList底层实现是链表。这也就导致了他们在对数据操作过程中,会有一定的偏差。

首先抛开这两个类不谈。我们先简单的了解一下数据结构中数组结构和链表结构的优缺点:

数组都是连续的,往往在内存中占据的是一段连续的空间,每一个值对应一个编号(索引值),这就方便我们很快的定位到某个具体元素,或者随机访问值。
我们想要在数组中追加元素,方法有很多种,可以在末尾追加,也可以在任意位置追加,这看似很方便,其实却拖慢了效率。
前文说过数组是一段连续的结构,那么我现在想在中间位置加入一个元素,为了其连续性不被破坏,就必须让其后的元素依次向后挪一位,把这个位置空出来,然后才能插入。删除亦是如此。

链表在内存中就不必是连续的,因为他是通过节点来操作的,就像一条链子一样,对于里面的每个元素而言,只用记住自己前面一个位置和后面一个位置的地址值就可以了。这样我们在插入或者删除的时候,就不用整体挪动了,只需要将他对应的前后节点重新赋值就行了。也就是说在链式结构中是没有索引值这个概念的
但这样也就导致了一个问题,就是我们在查找元素的时候就会相对比较麻烦,因为每个元素只知道自己前后的位置,所以如果我们要找一个元素,需要不断的去遍历,直到找到为止。

在Java中亦是如此,简而言之:

ArrayList更适合查找元素,但不适合插入和删除元素
LinkedList更适合插入和删除元素,但不适合查找

可能我们平时在联系的时候感觉不出来差别,但在处理超多数据的时候效果就明显了。下面我举一个小例子验证一下这个比较结论,在同一位置插入300000个元素:

package day_12_10;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random; /**
* @author soberw
* @Classname ListTest
* @Description
* @Date 2021-12-10 8:40
*/
public class ListTest {
public static void main(String[] args) {
System.out.printf("ArrayList插入300000个元素的时间是:%d\n",arrayAdd());
System.out.printf("LinkedList插入300000个元素的时间是:%d\n",linkAdd());
} public static long arrayAdd() {
long start = System.currentTimeMillis();
Random random = new Random();
List<Integer> arr = new ArrayList<>();
//添加一个元素
arr.add(1);
for (int i = 0; i < 300000; i++) {
//在 0 位置添加300000个元素
arr.add(0, random.nextInt(10));
}
long end = System.currentTimeMillis();
return end - start;
} public static long linkAdd() {
long start = System.currentTimeMillis();
Random random = new Random();
List<Integer> link = new LinkedList<>();
//添加一个元素
link.add(1);
for (int i = 0; i < 300000; i++) {
//在 0 位置添加300000个元素
link.add(0, random.nextInt(10));
}
long end = System.currentTimeMillis();
return end - start;
}
}


这时间差一下子就对比出来了。这说明在插入元素方面,LinkedList确实比ArrayList要快许多。

那么在具体情境中,我们还是要根据具体场景去选择使用哪一种。

总结

    1、 Arraylist底层是数组结构,LinkedList底层是链表结构,这导致了他们本质的区别。

    2、随机访问和查找元素ArrayList要优于LinkedList

    3、添加和删除元素LinkedList要优于ArrayList

文中有什么遗漏的点或者说得不对的地方,欢迎评论区指出,大家一起探讨学习。

浅谈Java中linkedlist和arraylist区别的更多相关文章

  1. 浅谈JAVA中HashMap、ArrayList、StringBuilder等的扩容机制

    JAVA中的部分需要扩容的内容总结如下:第一部分: HashMap<String, String> hmap=new HashMap<>(); HashSet<Strin ...

  2. 浅谈java中的"=="和eqals区别

    在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...

  3. 浅谈java中==与equals的区别

    今天做了一个业务模块,需要简单的遍历比较值,所以习惯性的用了 "==" ,但是结果没有达到预想的结果是什么鬼? 看到这里,有人一定会指出这俩货不是基本变量! "关系操作符 ...

  4. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  5. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  7. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  8. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  9. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

随机推荐

  1. Java常用的几种设计模式

    本来想写点spring相关的东西的,想来想去,先写点设计模式的东西吧 什么是设计模式?套用百度百科的话解释吧 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设 ...

  2. Linux7系统开通防火墙端口

    一.查看防火墙状态 查看防火墙状态 systemctl status firewalld 开启防火墙 systemctl start firewalld 关闭防火墙 systemctl stop fi ...

  3. [Docker] 制作并运行 Nginx 镜像

    环境 操作系统(cat /etc/redhat-release):CentOS Linux release 7.6.1810 (Core) Docker:18.09.6 文件 Dockerfile F ...

  4. 生产环境上,哨兵模式集群Redis版本升级应用实战

    背景: 由于生产环境上所使用的Redis版本并不一致,好久也没有更新,为了避免版本不同对Redis集群造成影响,从而升级为统一Redis版本! 1.集群架构 一主两从三哨兵: 2.升级方案 (1)升级 ...

  5. Solon 开发,一、注入或手动获取配置

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  6. 一网打尽JVM垃圾回收知识体系

    垃圾回收的区域 堆:Java 中绝大多数的对象都存放在堆中,是垃圾回收的重点 方法区:此中的 GC 效率较低,不是重点 由于虚拟机栈的生命周期和线程一致,因此不需要 GC 对象判活 在垃圾收集器对堆进 ...

  7. Android 12(S) 图形显示系统 - 示例应用(二)

    1 前言 为了更深刻的理解Android图形系统抽象的概念和BufferQueue的工作机制,这篇文章我们将从Native Level入手,基于Android图形系统API写作一个简单的图形处理小程序 ...

  8. cesium结合geoserver利用WFS服务实现图层删除(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  9. php的CI框架相关数据库操作

    在使用之前首先应该配置数据库的参数,详见文件application/config/database.php,里面包含主机名,登陆用户名,登录密码,数据库名,编码信息等. 在配置成功后,可以简单的调用: ...

  10. pytest文档3-测试用例setup和teardown

    用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(setup_function/teardown_function)只对函数用例生效(不在 ...