Java集合框架LinkedList詳解
LinkedList定義
1
2
3
4
5
6
7
8
|
package java.util; public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0 ; transient Node<E> first; transient Node<E> last; } |
LinkedList概述
LinkedList以雙向鏈表實現(xiàn),允許重復。(如下Node的實現(xiàn))并保留頭指針和尾指針。
1
2
3
4
5
6
7
8
9
10
11
|
private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this .item = element; this .next = next; this .prev = prev; } } |
鏈表無容量限制,但雙向鏈表本身使用了更多空間,也需要額外的鏈表指針操作。
按下標訪問元素—get(i)/set(i,e) 要悲劇的遍歷鏈表將指針移動到位(如果i>數(shù)組大小的一半,會從末尾移起)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public E get( int index) { checkElementIndex(index); return node(index).item; } public E set( int index, E element) { checkElementIndex(index); Node<E> x = node(index); E oldVal = x.item; x.item = element; return oldVal; } Node<E> node( int index) { // assert isElementIndex(index); if (index < (size >> 1 )) { Node<E> x = first; for ( int i = 0 ; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for ( int i = size - 1 ; i > index; i--) x = x.prev; return x; } } |
插入、刪除元素時修改前后節(jié)點的指針即可,但還是要遍歷部分鏈表的指針才能移動到下標所指的位置,只有在鏈表兩頭的操作—add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指針的移動。
非線程安全,可以調(diào)用Collections.synchronizedList(new LinkedList<>());實現(xiàn)。
LinkedList用法
簡單舉個例子:
1
2
3
4
5
6
7
8
9
|
List<Integer> list = new LinkedList<>(); list.add( 4 ); list.add( 2 ); list.add( 3 ); list.add( 5 ); for ( int i:list) System.out.println(i); System.out.println(list); |
運行結(jié)果:
1
2
3
4
5
|
4 2 3 5 [ 4 , 2 , 3 , 5 ] |
LinkedList會保留插入數(shù)據(jù)的順序。
subList的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
List<Integer> list = new LinkedList<>(); list.add( 4 ); list.add( 2 ); list.add( 3 ); list.add( 5 ); list.add( 7 ); list.add( 5 ); list.add( 11 ); list.add( 14 ); list.add( 10 ); list.add( 9 ); System.out.println(list); List<Integer> list2 = list.subList( 3 , 6 ); System.out.println(list2); list2.set( 2 , 50 ); System.out.println( "============" ); System.out.println(list); System.out.println(list2); |
運行結(jié)果:
1
2
3
4
5
|
[ 4 , 2 , 3 , 5 , 7 , 5 , 11 , 14 , 10 , 9 ] [ 5 , 7 , 5 ] ============ [ 4 , 2 , 3 , 5 , 7 , 50 , 11 , 14 , 10 , 9 ] [ 5 , 7 , 50 ] |
調(diào)用LinkedList中的subList方法生成的新的list,內(nèi)部引用的還是原來的鏈表,如果改變subList中的值,主list中的值也會跟著改變。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/u013256816/article/details/50916689