Java 进阶 (十七)ArrayList 与 LinkedList 的区别
一、ArrayList
ArrayList
其实是包装了一个数组 Object[]
,当实例化一个ArrayList
时,一个数组也被实例化,当向ArrayList
中添加对象时,数组的大小也相应的改变。这样就带来以下优缺点:
快速随机访问。你可以随机访问每个元素而不用考虑性能问题,通过调用
get(i)
方法来访问下标为 i 的数组元素。向其中添加对象速度慢。当你创建数组时并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。
操作其中对象的速度慢。当你想在数组中任意两个元素中间添加对象时,数组需要移动后面所有的对象。
二、LinkedList
LinkedList
是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点引用即可,删除记录时也一样。这样就带来以下优缺点:
操作对象的速度快。只需要改变连接,新的节点可以存储在内存中的任何地方。
不能随机访问。虽然存在
get()
方法,但是这个方法是通过遍历节点来定位的,所以速度慢。ArrayList
在随机访问方面性能较好,有点像数组。而LinkedList
在随机增删方面性能比较好,有点像链表。后者比较适合构造栈和队列。
说白了,就是数据结构中的顺序存储和链式存储。
三、拓展阅读:java 使用 new Date()和 System.currentTimeMillis()获取当前时间戳
在开发过程中,通常很多人都习惯使用 new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的。但是有些时候或许你并不需要获取那么多信息,你只需要关心它返回的毫秒数就行了,例如 getTime()。为了获取这个时间戳,很多人也喜欢使用new Date().getTime()
去获取,咋一看没什么问题,但其实没这个必要。其实看一下 java 的源码就知道了:
已经很明显了,new Date()
所做的事情其实就是调用了System.currentTimeMillis()
。如果仅仅是需要或者毫秒数,那么完全可以使用System.currentTimeMillis()
去代替new Date()
,效率上会高一点。况且很多人喜欢在同一个方法里面多次使用new Date()
,通常性能就是这样一点一点地消耗掉,这里其实可以声明一个引用。
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/ad280aa698dc2487e0f060090】。文章转载请联系作者。
评论