先判斷出入的數(shù)組a的大小是否足夠,若大小不夠則拓展。這里用到了發(fā)射的方法,重新實(shí)例化了一個(gè)大小為size的數(shù)組。之后將數(shù)組a賦值給數(shù)組result,遍歷鏈表向result中添加的元素。最后判斷數(shù)組a的長(zhǎng)度是否大于size,若大于則將size位置的內(nèi)容設(shè)置為null。返回a。
從代碼中可以看出,數(shù)組a的length小于等于size時(shí),a中所有元素被覆蓋,被拓展來(lái)的空間存儲(chǔ)的內(nèi)容都是null;若數(shù)組a的length的length大于size,則0至size-1位置的內(nèi)容被覆蓋,size位置的元素被設(shè)置為null,size之后的元素不變。
為什么不直接對(duì)數(shù)組a進(jìn)行操作,要將a賦值給result數(shù)組之后對(duì)result數(shù)組進(jìn)行操作?
---------------------------------------------------------------------------------------------------------------------------------
LinkedList的Iterator
除了Entry,LinkedList還有一個(gè)內(nèi)部類:ListItr。
ListItr實(shí)現(xiàn)了ListIterator接口,可知它是一個(gè)迭代器,通過(guò)它可以遍歷修改LinkedList。
在LinkedList中提供了獲取ListItr對(duì)象的方法:listIterator(int index)。
1 public ListIterator《E》 listIterator(int index) {
2 return new ListItr(index);
3 }
該方法只是簡(jiǎn)單的返回了一個(gè)ListItr對(duì)象。
LinkedList中還有通過(guò)集成獲得的listIterator()方法,該方法只是調(diào)用了listIterator(int index)并且傳入0。
下面詳細(xì)分析ListItr。
1 private class ListItr implements ListIterator《E》 {
2 // 最近一次返回的節(jié)點(diǎn),也是當(dāng)前持有的節(jié)點(diǎn)
3 private Entry《E》 lastReturned = header;
4 // 對(duì)下一個(gè)元素的引用
5 private Entry《E》 next;
6 // 下一個(gè)節(jié)點(diǎn)的index
7 private int nextIndex;
8 private int expectedModCount = modCount;
9 // 構(gòu)造方法,接收一個(gè)index參數(shù),返回一個(gè)ListItr對(duì)象
10 ListItr(int index) {
11 // 如果index小于0或大于size,拋出IndexOutOfBoundsException異常
12 if (index 《 0 || index 》 size)
13 throw new IndexOutOfBoundsException(“Index: ”+index+
14 “, Size: ”+size);
15 // 判斷遍歷方向
16 if (index 《 (size 》》 1)) {
17 // next賦值為第一個(gè)節(jié)點(diǎn)
18 next = header.next;
19 // 獲取指定位置的節(jié)點(diǎn)
20 for (nextIndex=0; nextIndex《index; nextIndex++)
21 next = next.next;
22 } else {
23 // else中的處理和if塊中的處理一致,只是遍歷方向不同
24 next = header;
25 for (nextIndex=size; nextIndex》index; nextIndex--)
26 next = next.previous;
27 }
28 }
29 // 根據(jù)nextIndex是否等于size判斷時(shí)候還有下一個(gè)節(jié)點(diǎn)(也可以理解為是否遍歷完了LinkedList)
30 public boolean hasNext() {
31 return nextIndex != size;
32 }
33 // 獲取下一個(gè)元素
34 public E next() {
35 checkForComodification();
36 // 如果nextIndex==size,則已經(jīng)遍歷完鏈表,即沒(méi)有下一個(gè)節(jié)點(diǎn)了(實(shí)際上是有的,因?yàn)槭茄h(huán)鏈表,任何一個(gè)節(jié)點(diǎn)都會(huì)有上一個(gè)和下一個(gè)節(jié)點(diǎn),這里的沒(méi)有下一個(gè)節(jié)點(diǎn)只是說(shuō)所有節(jié)點(diǎn)都已經(jīng)遍歷完了)
37 if (nextIndex == size)
38 throw new NoSuchElementException();
39 // 設(shè)置最近一次返回的節(jié)點(diǎn)為next節(jié)點(diǎn)
40 lastReturned = next;
41 // 將next“向后移動(dòng)一位”
42 next = next.next;
43 // index計(jì)數(shù)加1
44 nextIndex++;
45 // 返回lastReturned的元素
46 return lastReturned.element;
47 }
48
49 public boolean hasPrevious() {
50 return nextIndex != 0;
51 }
52 // 返回上一個(gè)節(jié)點(diǎn),和next()方法相似
53 public E previous() {
54 if (nextIndex == 0)
55 throw new NoSuchElementException();
56
57 lastReturned = next = next.previous;
58 nextIndex--;
59 checkForComodification();
60 return lastReturned.element;
61 }
62
63 public int nextIndex() {
64 return nextIndex;
65 }
66
67 public int previousIndex() {
68 return nextIndex-1;
69 }
70 // 移除當(dāng)前Iterator持有的節(jié)點(diǎn)
71 public void remove() {
72 checkForComodification();
73 Entry《E》 lastNext = lastReturned.next;
74 try {
75 LinkedList.this.remove(lastReturned);
76 } catch (NoSuchElementException e) {
77 throw new IllegalStateException();
78 }
79 if (next==lastReturned)
80 next = lastNext;
81 else
82 nextIndex--;
83 lastReturned = header;
84 expectedModCount++;
85 }
86 // 修改當(dāng)前節(jié)點(diǎn)的內(nèi)容
87 public void set(E e) {
88 if (lastReturned == header)
89 throw new IllegalStateException();
90 checkForComodification();
91 lastReturned.element = e;
92 }
93 // 在當(dāng)前持有節(jié)點(diǎn)后面插入新節(jié)點(diǎn)
94 public void add(E e) {
95 checkForComodification();
96 // 將最近一次返回節(jié)點(diǎn)修改為header
97 lastReturned = header;
98 addBefore(e, next);
99 nextIndex++;
100 expectedModCount++;
101 }
102 // 判斷expectedModCount和modCount是否一致,以確保通過(guò)ListItr的修改操作正確的反映在LinkedList中
103 final void checkForComodification() {
104 if (modCount != expectedModCount)
105 throw new ConcurrentModificationException();
106 }
107 }
評(píng)論
查看更多