博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解Java中ArrayList、Vector、LinkedList三者的异同点(转)
阅读量:7111 次
发布时间:2019-06-28

本文共 1554 字,大约阅读时间需要 5 分钟。

 

本文转自

一、ArrayList

ArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型的对象。顾名思义,ArrayList是一个数组列表,因此其内部是使用一个数组来存放对象的,因为Object是一切类型的父类,因而ArrayList内部是有一个Object类型的数组类存放对象。ArrayList类常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同时ArrayList内部有一个私有类实现Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器,同时,还有一个私有类实现了ListIterator接口,因此ArrayList也可以调用listIterator()方法得到ListIterator迭代器。

由于ArrayList是依靠数组来存放对象的,只不过封装起来了而已,因此其一些查找方法的效率都是O(n),跟普通的数组效率差不多,只不过这个ArrayList是一个可变”数组“,并且可以存放一切指定的对象。

另外,由于ArrayList的所有方法都是默认在单一线程下进行的,因此ArrayList不具有线程安全性。若想在多线程下使用,应该使用Colletions类中的静态方法synchronizedList()对ArrayList进行调用即可。

二、LinkedList

LinkedList可以看做为一个双向链表,所有的操作都可以认为是一个双向链表的操作,因为它实现了Deque接口和List接口。同样,LinkedList也是线程不安全的,如果在并发环境下使用它,同样用Colletions类中的静态方法synchronizedList()对LinkedList进行调用即可。

在LinkedList的内部实现中,并不是用普通的数组来存放数据的,而是使用结点<Node>来存放数据的,有一个指向链表头的结点first和一个指向链表尾的结点last。不同于ArrayList只能在数组末尾添加数据,LinkList可以很方便在链表头或者链表尾插入数据,或者在指定结点前后插入数据,还提供了取走链表头或链表尾的结点,或取走中间某个结点,还可以查询某个结点是否存在。add()方法默认在链表尾部插入数据。总之,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明显高于ArrayList类型,但是查询的效率要低一点,因为它是一个双向链表。

因此,LinkedList与ArrayList最大的区别是LinkedList更加灵活,并且部分方法的效率比ArrayList对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用ArrayList。

三、Vector

Vector也是一个类似于ArrayList的可变长度的数组类型,它的内部也是使用数组来存放数据对象的。值得注意的是Vector与ArrayList唯一的区别是,Vector是线程安全的,即它的大部分方法都包含有关键字synchronized,因此,若对于单一线程的应用来说,最好使用ArrayList代替Vector,因为这样效率会快很多(类似的情况有StringBuffer与StringBuilder);而在多线程程序中,为了保证数据的同步和一致性,可以使用Vector代替ArrayList实现同样的功能。

转载于:https://www.cnblogs.com/lenkevin/p/5505063.html

你可能感兴趣的文章
【iOS工具】注释插件 VVDocumenter-Xcode 的安装使用及误点击“Skip Bundle”的解决办法!...
查看>>
【线上直播】Jupyter数据可视化
查看>>
Webpack 4 学习总结
查看>>
构造函数内的方法与构造函数prototype属性上方法的对比
查看>>
【划重点】MySQL技术内幕:InnoDB存储引擎
查看>>
基于泛型编程的序列化实现方法
查看>>
浅谈前端路由
查看>>
219. Contains Duplicate II
查看>>
webpack 的 scope hoisting 是什么?
查看>>
Objective-C中的associated object释放时机问题
查看>>
九种跨域方式实现原理
查看>>
web性能优化
查看>>
PAT A1037
查看>>
从0到1,一步步开发React的loading组件,并发布到npm上
查看>>
sas 做 titanic 未完待续
查看>>
区块链是一种用一种不可变的形式存储数字信息
查看>>
使用react hooks实现自己的context-redux
查看>>
Redis 使用记录(四)
查看>>
2.进程
查看>>
【PAT系列】PAT B1010
查看>>