JAVA api (List,ArrayList,LinkedList的作用和實現)
阿新 • • 發佈:2021-01-21
JAVA api(Collection的概念和用法)
List依然是一個介面它繼承了Collection的功能並且增加了自己的新功能。
List
我們先來大致的說一下List介面的特性:
1.List預設是有順序的(按照輸入元素的順序輸出)
2.List可以有重複元素。
3.List 在1.8版本以後 初始容量是空的 1.6版本以後是給 10 個容量(自動擴容:當容量不夠的時候會自動增加容量)
4.我們也可以給List賦初始容量。
現在我們來看一下新的方法。
方法 | 作用 |
---|---|
void add(int index, E element) | 在索引出插入元素 |
E get(int index) | 得到該索引處的值 |
int indexOf(Object o) | 返回該值第一次出現的位置 |
int lastIndexOf(Object o) | 返回該值最後一次出現的位置 |
E remove(int index) | 刪除對應索引的值 |
E set(int index, E element) | 將索引處的值替換為指定元素 |
List<Integer> l1 = new ArrayList<Integer>(2);
l1.add(2);
l1.add(1);
l1.add(3);
//在指定地方插入指定元素(前者為索引值,後者為要存的值從0開始,注意長度)
l1. add(3,4);
System.out.println(l1);
//根據索引獲取位置元素
System.out.println(l1.get(1));
//返回第一次出現該元素的索引值
System.out.println(l1.indexOf(1));
//返回最後一次出現該元素的索引值
System.out.println(l1.lastIndexOf(1));
//刪除對應索引值的元素(注意長度))
l1.remove(1);
System.out.println(l1);
//替換(前者為索引值,後者為要存的值,從0開始,注意長度)
l1.set(2,9) ;
System.out.println(l1);
//擷取(含頭不含尾)
List<Integer> l2 = l1.subList(1, 3);
System.out.println(l2);
此時我們依舊可以使用迭代,但是使用方式多了一種:
Iterator<Integer> it = l1.iterator();
for(Integer i: l1) {
System.out.print(i+" ");
}
System.out.println();
ListIterator<Integer> it2 = l1.listIterator();
//順序遍歷(從前往後)
while (it2.hasNext()) {
System.out.print(it2.next()+" ");
}
System.out.println();
//逆向遍歷(從後往前)(此處需要注意如果沒有從前往後從後往前應該是用不了)
while (it2.hasPrevious()) {
System.out.print(it2.previous()+" ");
}
ArrayList
ArrayList底層是用Object陣列實現的,可以認為ArrayList是一個可改變大小的陣列。隨著越來越多的元素被新增到ArrayList中,其規模是動態增加的。而它自動擴容的原理是當長度不夠後,呼叫copyOf()來給陣列擴容,一般擴容大小為現在大小的1.5倍。
它有了陣列的結構,當然也會有陣列的優勢:它的查詢和遍歷的速度是最快的(人家有下標啊),但是它的增加刪除卻不會很快(要麼修改元素的後邊元素全都前移要麼全都後移簡直要命)。
過於底層的東西,就不總結了,我還依稀記得學C++的時候手寫這些東西的痛苦。我喜歡JAVA的地方就在於它封裝的很棒,層次分明條理清晰。
LinkedList
LinkedList底層是個鏈式結構,雙向連結串列,兩端效率高。
1.LinkedList的查詢沒有ArrayList快但是增加和刪除快速很多。
2.在空間上的儲存是不連續的。
我們先來看幾個方法。
第一套
方法名 | 作用 |
---|---|
public void addFirst(E e) | 元素新增至元素首部 |
public void addFirst(E e) | 元素新增至元素尾部 |
public E getFirst() | 得到首元素 |
public E getLast() | 得到尾元素 |
public E removeFirst() | 移除首元素 |
public E removeLast() | 移除尾元素 |
第二套
方法名 | 作用 |
---|---|
public boolean offerFirst(E e) | 元素新增至元素首部 |
public boolean offerLast(E e) | 元素新增至元素尾部 |
public E peekFirst() | 得到首元素 |
public E peekLast() | 得到尾元素 |
public E pollFirst() | 移除首元素 |
public E pollLast() | 移除尾元素 |
LinkedList<Integer> l1= new LinkedList<Integer>();
l1.add(1);
l1.add(2);
l1.add(3);
l1.add(4);
System.out.println("初始連結串列:"+l1);
l1.addFirst(5);//首元素
l1.addLast(6);//尾元素
System.out.println("首尾新增:"+l1);
System.out.println(l1.getFirst());//獲取首元素
System.out.println(l1.getLast());//取尾元素
System.out.println(l1.removeFirst());//移除首元素
System.out.println(l1.removeLast());//移除尾元素
l1.offerFirst(1);
l1.offerLast(2);
System.out.println(l1);
System.out.println(l1.peekFirst());
System.out.println(l1.peekLast());
System.out.println(l1.pollFirst());
System.out.println(l1);
Iterator it = l1.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}