浅析ArrayList,LinkedList的执行效率
以前见过很多文章说这两个东西,感觉自己还是没有深入理解,今天看了书明白一些,在此提出来和大家共同探讨:
面试的时候(基础)一般会问你使用过LinkedList或者ArrayList没有,简单的回答有或者没有肯定不是面试官的期望答案,一般有经验的小伙伴都会说,如果该集合进行的增删操作比较多,建议使用LinkedList,如果是查询较多建议使用ArrayList,原理就用下面两个程序来说说吧:
(1) public static void makeList (List<Integer> list , int N) {
list.clear;
for(int i = 0 ; i <= N; i ++)
list.add( 0, i);
}
以上程序比较简单,就是在一个List的首位插入一个元素,以上程序毫无疑问,对于ArrayList来说,他的执行效率是O(N × N),但是对于LinkedList来说,他的执行效率为O(N),如果不太了解原因的小伙伴,估计是你不知道两种List的实现方式,ArrayList实现为数组,可以直接获取到对应位置的元素,但是添加需要以此移动该位置后面的每一个元素,LinkedList实现方式为链表,查询任何元素都必须从首元素开始扫描,删除则可以直接删除对应位置,无需移动后面的元素。明白这些以后,再来看下面的程序:
(2)public static void sum(List<Integer> list ) {
int total = 0;
for(int i = 0 ; i <= N; i ++)
total += list.get(i);
}
这里的执行效率与上面的刚好相反。
这里我们使用的便利list的方式都是一般的普通for循环,相信了解java的小伙伴都知道还有一个增强的for循环吧,对了,如果这里我们将(2)程序中的循环换成增强的for循环,那么他使用任何一种list的执行效率都是O(N),这是为什么呢?原因很简单,因为增强的for循环底层使用的是Iterator迭代器,该迭代器会保存list的每一个当前位置,并且有效的推进到下一位置,故效率一样了。正是由于使用增强的for循环底层是Iterator,该迭代器每次都会返回,因此我们使用增强的for循环时,不能对集合进行增加和删除,因为他会改变迭代器的结构,以至于会抛出异常ConcurrentModificationException,所以小伙伴们,知道以后怎么用了吧
浅析ArrayList,LinkedList的执行效率的更多相关文章
- ArrayList 和 LinkedList的执行效率比较
一.概念: 一般我们都知道ArrayList* 由一个数组后推得到的 List.作为一个常规用途的对象容器使用,用于替换原先的 Vector.允许我们快速访问元素,但在从列表中部插入和删除元素时,速度 ...
- ArrayList和LinkedList插入删除效率的测试(完全不在一个数量级8/20)
通过index获取元素的值 java里面的链表可以添加索引,而C中的链表,是没有索引的 package ArrayListVSLinkedList; import java.util.ArrayLis ...
- ArrayList LinkedList Vector
ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...
- ArrayList, LinkedList, Vector - dudu:史上最详解
ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...
- Vector,ArrayList, LinkedList的区别
1.Vector.ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储. 2.List中的元素有序.允许有重复的元素,Set中的元素无序.不允许有重复元素. ...
- 09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHashSet,TreeSet
09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHas ...
- 【java基础】java中ArrayList,LinkedList
[一]ArrayList 一ArrayList的内部结构 (1)ArrayList内部维护的是一个Object数组 (2)ArrayList数组扩容后数组的长度的公式:旧的数组长度+(旧数组长度> ...
- 怎么优化JAVA程序的执行效率和性能?
现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...
- ArrayList,LinkedList的对比
ArrayList,LinkedList都是Collection接口的通用实现方式,两者采用了不用的存储策略,用来适应不同场合的需要. 实现方式 ArrayList的内部采用集合的方式存储数据 唯一需 ...
随机推荐
- Java 实现观察者(Observer)模式
1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...
- Android系统权限和root权限大全
tyle="margin:20px 0px 0px; font-size:14.285714149475098px; line-height:26px; font-family:Arial; ...
- IOS之【地图MapKit】
iOS地图位置开发 iPhone SDK提供了三个类来管理位置信息:CLLocation CLLocationManager 和 CLLHeading(不常用).除了使用GPS来获取当前的位置信息 ...
- net析构函数对垃圾回收的影响
net析构函数对垃圾回收的影响 之前忘了说了 代码都是在Release模式下运行的,现在补充上. 这里说析构函数,其实并不准确,应该叫Finalize函数,Finalize函数形式上和c++的析构函数 ...
- rsync Backups for Windows
Transfer your Windows Backups to an rsync server over SSH rsync.net provides cloud storage for offsi ...
- Webbrowser加载Flash后方向键失效问题(用到了OLE接口,没有被处理就转发,够复杂的)
原文:http://blog.csdn.net/dropme/article/details/6253528 窗体上放一个ApplicationEvent控件,OnMessage事件中这么写 uses ...
- CentOS6.4 编译安装Python 3.3.2 - CRPER木木
基础环境: CentOS6.4(预装GCC,或者联网YUM---GCC编译写进这里太臃肿,找机会另外写一篇) Python 3.3.2 下载链接: http://www.python.org/ ...
- Android 系统搜索框(有浏览记录)
实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件 要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...
- Delphi主窗口任务栏菜单的问题(转发WM_SYSCOMMAND到Application)
Delphi的VCL框架在创建应用时TApplication是一个自动创建的隐藏窗口,其它创建的窗口是自动以该窗口为窗口,这就导致创始的主窗口在任务栏的系统菜单只有三项,只要在主窗口的Create事件 ...
- JSP内置对象Session
创建和获取客户的会话 setAttribute()与getAttribute() session.setAttribute(String name , Object obj) 如session.set ...