浅析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的内部采用集合的方式存储数据 唯一需 ...
随机推荐
- prevPage / nextPage in jQuery Mobile | George Nixon's Blog
prevPage / nextPage in jQuery Mobile | George Nixon's Blog ui.prevPage[0].id I finally worked this o ...
- JavaScript编程:使用DOM操作样式表
6.使用DOM操作样式表: 操纵元素的Style样式属性: background-color:style.backgroundColor color:style.col ...
- Nginx 负载均衡配置和策略
Nginx 的 HttpUpstreamModule 提供对后端(backend)server的简单负载均衡.一个最简单的 upstream 写法例如以下: upstream backend { se ...
- POJ2782:Bin Packing
Description A set of n<tex2html_verbatim_mark> 1-dimensional items have to be packed in iden ...
- Jetty:配置JSP支持
选择JSP实现 从Jetty-9.2開始,使用Apache Jasper作为默认JSP容器实现.在前面的版本号中使用的是Glassfish Jasper,在后面的版本号中也能够继续使用它. Jetty ...
- STL algorithm算法lower_bound和upper_bound(31)
lower_bound原型: function template <algorithm> std::lower_bound default (1) template <class F ...
- MySQL 创建函数(Function)
目标 怎么样MySQL创建数据库功能(Function) 语法 CREATE FUNCTION func_name ( [func_parameter] ) //括号是必须的,參数是可选的 RETUR ...
- Swift - 点击输入框外部屏幕关闭虚拟键盘
我们如果把文本框的Return Key设置成Done,然后在storyboard中将文本框的Did End On Exit事件在代码里进行关联.同时关联代码里调用文本框的resignFirstResp ...
- C++ - Operator Precedence
The following table lists the precedence and associativity of C++ operators. Operators are listed to ...
- delphi 网页提交按钮执行点击事件
遍历即可实现,下列代码仅供参考: var i: integer; T: OleVariant; begin T := WebBrowser1.Document; do begin if T.all.i ...