Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d6369fc

Browse files
committed
when-to-use-linkedlist-over-arraylist
1 parent 5c54ced commit d6369fc

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ stackoverflow-Java-top-qa
2424

2525
> 性能
2626
27-
*
27+
* [LinkedList、ArrayList各自的使用场景,如何确认应该用哪一个呢?](https://github.com/giantray/stackoverflow-java-top-qa/blob/master/when-to-use-linkedlist-over-arraylist.md)
28+
2829

2930
### 待翻译问题链接(还剩0问题)
3031
- [Why is processing a sorted array faster than an unsorted array?](http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array)
@@ -35,7 +36,6 @@ stackoverflow-Java-top-qa
3536
- [Why is char[] preferred over String for passwords?](http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords)
3637
- [Generating random integers in a range with Java](http://stackoverflow.com/questions/363681/generating-random-integers-in-a-range-with-java)
3738
- [Why is printing "B" dramatically slower than printing "#"?](http://stackoverflow.com/questions/21947452/why-is-printing-b-dramatically-slower-than-printing)
38-
- [When to use LinkedList over ArrayList?](http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist)
3939
- [What is a serialVersionUID and why should I use it?](http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it)
4040
- [In Java, what's the difference between public, default, protected, and private?](http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private)
4141
- [Converting String to int in Java?](http://stackoverflow.com/questions/5585779/converting-string-to-int-in-java)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
##LinkedList、ArrayList各自的使用场景,如何确认应该用哪一个呢?
2+
3+
一言以蔽之,在大部分情况下,使用ArrayList会好一些。
4+
5+
###耗时上各有优缺点。ArrayList稍有优势
6+
List只是一个接口,而LinkedList、ArrayList是List的不同实现。LinkedList的模型是双向链表,而ArrayList则是动态数组
7+
首先对比下常用操作的算法复杂度
8+
9+
#####LinkedList
10+
- get(int index) : O(n)
11+
- add(E element) : O(1)
12+
- add(int index, E element) : O(n)
13+
- remove(int index) : O(n)
14+
- Iterator.remove() : O(1) <--- LinkedList<E>的主要优点
15+
- ListIterator.add(E element) is O(1) <--- LinkedList<E>的主要优点
16+
17+
#####ArrayList
18+
- get(int index) : O(1) <--- ArrayList<E>的主要优点
19+
- add(E element) : 基本是O(1) , 因为动态扩容的关系,最差时是 O(n)
20+
- add(int index, E element) : 基本是O( n - index) , 因为动态扩容的关系,最差时是 O(n)
21+
- remove(int index) : O(n - index) (例如,移除最后一个元素,是 O(1))
22+
- Iterator.remove() : O(n - index)
23+
- ListIterator.add(E element) : O(n - index)
24+
- LinkedList,因为本质是个链表,所以通过Iterator来插入和移除操作的耗时,都是个恒量,但如果要获取某个位置的元素,则要做指针遍历。因此,get操作的耗时会跟List长度有关
25+
26+
对于ArrayList来说,得益于快速随机访问的特性,获取任意位置元素的耗时,是常量的。但是,如果是add或者remove操作,要分两种情况,如果是在尾部做add,也就是执行add方法(没有index参数),此时不需要移动其他元素,耗时是O(1),但如果不是在尾部做add,也就是执行add(int index, E element),这时候在插入新元素的同时,也要移动该位置后面的所有元素,以为新元素腾出位置,此时耗时是O(n-index)。另外,当List长度超过初始化容量时,会自动生成一个新的array(长度是之前的1.5倍),此时会将旧的array移动到新的array上,这种情况下的耗时是O(n)。
27+
28+
**总之,get操作,ArrayList快一些。而add操作,两者差不多**。(除非是你希望在List中间插入节点,且维护了一个Iterator指向指定位置,这时候linkedList能快一些,但是,我们更多时候是直接在尾部插入节点,这种特例的情况并不多)
29+
30+
###空间占用上,ArrayList完胜
31+
看下两者的内存占用图
32+
![](http://img.blog.csdn.net/20141017095352885?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl6ZXlhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
33+
34+
这三个图,横轴是list长度,纵轴是内存占用值。**两条蓝线是LinkedList,两条红线是ArrayList**
35+
36+
可以看到,LinkedList的空间占用,要远超ArrayList。LinkedList的线更陡,随着List长度的扩大,所占用的空间要比同长度的ArrayList大得多。
37+
注:从mid JDK6之后,默认启用了CompressedOops ,因此64位及32位下的结果没有差异,LinkedList x64和LinkedList x32的线是一样的。
38+
39+
stackoverflow原址:
40+
http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /