学习ArrayList 和 LinkedList小记【2】
写完第一篇笔记后又翻了好多博客,觉得这篇对LinkedList的理解有帮助,链接如下:
http://niub.iteye.com/blog/1786608
直接上博主结论:
ArrayList是数组的实现形式(内部存储结构是一个数组):
添加新的元素到数组末尾时,如果超过了当前容量,就要对数组进行扩容,扩充为原来大小的1.5倍,由于扩容牵涉到整个数组的copy,对性能影响较大,所以如果知道要存放容量的大小,尽量在创建ArrayList时指定
ArrayList就是一个数组实现,适用于, 查找操作较多,而修改操作(add和delete)较少的情况,由于实现较为简单。
LinkedList适用于:查找较少,修改较多的情况(这与LinkedList的链式结构是有关系的)。
LinkedList是链表结构的实现形式(内部存储结构是一个链表形式)。
另外,由于LinkedList实现了双向队列Deque接口,所以也具有队列的相关操作,可以当做一个队列使用。
本篇博客着重分析了linkedList的增删改差的一些源码,可以让你对linkedList有更深刻的认知(如果平时使用不多的话),源码就不重复展示了。
关于RandomAccess
在小记【1】里提到了这个接口,我也找了相关博客:
http://blog.csdn.net/keda8997110/article/details/8635005
简单说RandomAccess接口是影响你遍历算法的,没有实现RandomAccess的,和实现了RandomAccess的集合,走增强for循环遍历时的算法是不一样的。
官方是推荐我们去让集合实现这个接口,但linkedList并没有实现它,而是实现了队列接口
博客还提供了测试代码:
<span style="font-size: small;">/* * To change this template, choose Tools | Templates * and open the template in the editor. */
package testrandomaccess; import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.RandomAccess; /** * * @author bolong */
public class TestRandomAccess {
// 初始化列表 public static void initList(List list, int n) { for (int i = 0; i < n; i++) { list.add(i); } }
//使用循环进行对列表的迭代 public static void traverseWithLoop(List list) { long starttime = 0; long endtime = 0; starttime = System.currentTimeMillis(); for (int count = 0; count <= 1000; count++) { for (int i = 0; i < list.size(); i++) { list.get(i); } } endtime = System.currentTimeMillis(); System.out.println("使用loop迭代一共花了" + (endtime - starttime) + "ms时间"); }
//使用迭代器对列表进行迭代 public static void traverseWithIterator(List list) { long starttime = 0; long endtime = 0; starttime = System.currentTimeMillis(); for (int count = 0; count <= 1000; count++) { for (Iterator itr = list.iterator(); itr.hasNext();) { itr.next(); } } endtime = System.currentTimeMillis(); System.out.println("使用Iterator迭代一共花了" + (endtime - starttime) + "ms时间"); } public static void traverse(List list) { long starttime = 0; long endtime = 0; if (list instanceof RandomAccess) { System.out.println("该list实现了RandomAccess接口"); starttime = System.currentTimeMillis(); for (int count = 0; count <= 1000; count++) { for (int i = 0; i < list.size(); i++) { list.get(i); } } endtime = System.currentTimeMillis(); System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间"); } else { System.out.println("该list未实现RandomAccess接口"); starttime = System.currentTimeMillis(); for (int count = 0; count <= 1000; count++) { for (Iterator itr = list.iterator(); itr.hasNext();) { itr.next(); } } endtime = System.currentTimeMillis(); System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间"); } } public static void main(String[] args) { ArrayList arraylist = new ArrayList(); LinkedList linkedlist = new LinkedList(); initList(arraylist, 1000); initList(linkedlist, 1000); traverse(arraylist); traverse(linkedlist); traverseWithIterator(arraylist); traverseWithLoop(arraylist); traverseWithIterator(linkedlist); traverseWithLoop(linkedlist); }
}
</span>
结论:
根据程序输出的结果的确证明了,arraylist等实现了RandomAccessj接口的类在进行迭代时使用loop效率更高,而linkedList那些未实现该接口的类在进行迭代时使用Iterator进行迭代效率更高.
学习ArrayList 和 LinkedList小记【2】相关推荐
- JDK源码学习之Arraylist与LinkedList
ArrayList和LinkedList是我们在开发过程中常用的两种集合类,本文将从底层源码实现对其进行简单介绍. 下图是Java集合类所涉及的类图. 一.ArrayList 从上面的集合类图可以看出 ...
- vector 插入_Java学习五分钟系列:对比Vector、ArrayList、LinkedList
Java学习五分钟系列,目的是为让大家在短时间内搞清楚一项技术的概念.优缺点和适用场景,想要深入的了解,还需要投入更多的时间. Java的集合类,值得我们深入的学习,建议大家有时间的话,可以阅读一下源 ...
- 【java学习】Arraylist和LinkedList使用场景与性能对比
介绍 ArrayList LinkedList 使用场景对比 两个实例: 二分查找 插入元素 总结 介绍 List 的三个子类的特点: ArrayList 底层结构是数组,底层查询快,增删慢. Lin ...
- 某团技术拷问:ArrayList 和 LinkedList 哪个更占空间?
HR力荐了一个工作 4 年,目前年薪 40W+ 的候选人. 看他简历,从 JVM.MySQL.Redis,再到悲观锁.乐观锁一个都不缺,并发编程.分布式也都接触过,像是个实力派! 着急用人,就赶紧叫人 ...
- Java集合:ArrayList和LinkedList区别?
ArrayList和LinkedList的大致区别如下: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayL ...
- java温故笔记(二)java的数组HashMap、ConcurrentHashMap、ArrayList、LinkedList
为什么80%的码农都做不了架构师?>>> HashMap 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(Java Develo ...
- java集合框架05——ArrayList和LinkedList的区别
前面已经学习完了List部分的源码,主要是ArrayList和LinkedList两部分内容,这一节主要总结下List部分的内容. List概括 先来回顾一下List在Collection中的的框架图 ...
- java c 性能比较_java 中ArrayList与LinkedList性能比较
java 中ArrayList与LinkedList性能比较 今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 LinkedList,用到的情景是在一个循环里面进行顺序的插入操 ...
- 27、ArrayList和LinkedList的区别
在Java的List类型集合中,ArrayList和LinkedList大概是最常用到的2个了,细看了一下它们的实现,发现区别还是很大的,这里简单的列一下个人比较关心的区别. 类声明 ArrayLis ...
最新文章
- Linux文件与目录管理(文件查阅)
- 怎样让小写自动转换成大写_办公软件操作技巧031:如何在word中输入大写数字...
- python的tkinter的用法_Python Tkinter图形工具使用方法及实例解析
- Python 计算机视觉(九)—— OpenCV进行图像平滑
- 4.3.2 基于集合的操作
- 人脸识别资源推荐:20款人脸检测/识别的API、库和软件
- flask 配置静态文件模板文件
- 【Oracle】Oracle通过表名查询触发器
- c/c++ linux 进程 fork wait函数
- 上周四更新决战俄罗斯小游戏的发包问题
- C语言:段错误产生原因及简单的调试方法
- MathType删除注册表
- 外汇会计-概念-升水(Premium)
- C++中的拷贝构造函数
- 流程框图——各方框含义
- k8s出现问题导致cpu使用率过高
- 排查tomcat项目假死原因的简单方法
- windows 7 iso镜像刻录到U盘后选择安装的版本
- 启动报错 Bean instantiation via factory method failed
- Kafka 数据丢失与优化
热门文章
- maven出现错误 大难题-------
- html表格的多个下拉菜单,表格设置下拉多个选项
- 多页vue应用的单页面打包方法(内含打包模式的应用)
- 罗敏为什么不焦虑? | 一点财经
- 计算机辅助项目管理课程方案,计算机辅助项目管理课程设计-20210310112313.pdf--原创力文档...
- vue生命周期和vue-resource
- java.sql.SQLException: Incorrect string value: ‘\xE6\xB5\x8B\xE8\xAF\x95...‘ for column ‘xxx‘
- 1.Lunix系统安装及重置root密码
- 如何清除win10右下角输入法图标?
- 软件测试工程师需要学什么?