ArrayList和LinkedList区别?
一、ArrayList和LinkedList区别
从实现看:
LinkedList底层实现是双链表ArrayList底层实现是动态数组从扩容机制看:
LinkedList不存在扩容 的说法,因为是链表结构。ArrayList底层是动态数组存在扩容说法,默认的数组大小是10,在检测是否需要扩容后,如果扩容,会扩容为原来的1.5倍大小。原理就是把老数组的元素存储到新数组里面从优点看:
ArrayList的查找性能好,因为底层是数组,适用于查找元素。LinkedList底层是双链表,对于插入或者删除元素来说,操作方便,性能高。从缺点看:
ArrayList因为是一块连续的内存,存储数据元素,所以如果要删除或者插入一个元素,那么之前或者之后的元素都要移动,代价很高。LinkedList是链表,在内存中可以是不连续的,通过指针连接结点,如果要查找元素,必须去遍历整个链表,这样就比较麻烦。从安全角度看:
ArrayList在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使ArrayList是线程安全的,那么可以选择使用Collections.synchronizedList(new ArrayList())LinkedList在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使LinkedList是线程安全的,那么可以选择使用Collections.synchronizedList(new LinkedList())LinkedList和ArrayList的数据存储都是有序的,而且元素是可以重复的。
延伸阅读:
二、Iterator 的 fail-fast 和 fail-SAFe
fail-fast 简单来说就是不允许一边遍历一边修改,而 fail-SAFe 允许遍历的时候修改 list, 最新的修改不会被遍历到。
fail-fast 的实现原理又是什么呢?主要的实现是由 Iterator 这个接口的实现类来决定的,所以你会发现我们在使用 ArrayList 的时候如果是迭代器遍历,此时是不能修改的,核心就是两个参数,一个是 ArrayList 的成员变量 modCount 这个值会在每次修改 list 的时候加 1 , 而在 ArrayList 中的 Iterator 实现类中也维护了一个变量 expectedModCount,这个值默认等于 modCount 我们使用迭代器 next 方法的时候都会比较 modCount, expectedModCount 是否相等,如果不相等就会报错,这也就保证了 fail-fast。
以上就是关于ArrayList和LinkedList区别的内容希望对大家有帮助。

猜你喜欢LIKE
相关推荐HOT
更多>>
大数据分析与数据分析有什么区别?
一、大数据分析与数据分析的区别大数据分析与数据分析有以下区别:1、数据规模不同大数据分析通常处理海量数据,而数据分析则处理小规模数据。2...详情>>
2023-10-11 23:04:34
地址传递和值传递有哪些区别?
一、地址传递和值传递的区别地址传递和值传递都是计算机编程中常用的参数传递方式,它们之间的主要区别如下:1、定义不同值传递:将函数调用中...详情>>
2023-10-11 20:05:08
nodeJs的多线程和一般erlang?
一、nodeJs的多线程和一般erlangnodeJs的多线程Node.js 通过提供 cluster、child_process API 创建子进程的方式来赋予Node.js “多线程”能力。...详情>>
2023-10-11 18:21:42
java中 get和post 区别?
一、java中 get和post 区别1.首先get是用来获取数据的,post是向服务器提交数据。2.get传递形式是通过URL进行传输,以key=value的格式,添加在u...详情>>
2023-10-11 17:16:19热门推荐
大数据分析与数据分析有什么区别?
沸原型模式和应用拷贝构造函数、重载赋值操作符有什么区别?
热原始卡尔曼滤波算法(KF)、扩展卡尔曼滤波算法(EKF)以及无迹卡尔曼滤波算法(UKF)三者之间的区别?
热dos和windows的区别?
新c语言char和int区别?
组策略和组策略对象有什么区别?
地址传递和值传递有哪些区别?
Java中的接口和API 有哪些区别?
手机和计算机软件编程的区别?
nodeJs的多线程和一般erlang?
ArrayList和LinkedList区别?
java中 get和post 区别?
JSP和Blazor有什么区别?
分布式与集群的区别是什么?
技术干货






