LinkedList與ArrayList的異同
阿新 • • 發佈:2018-11-04
LinkedList是一個底層為連結串列的類,LinkedList繼承AbstractSequentialList,與ArrayList一樣實現AbstractList介面。LinkedList類具有 size(資料個數),node:prio (前驅),node:next(後繼)三個特殊的屬性。
與ArrayList一樣,LinkedList有add,remove,get等方法,我們可以直接來使用。下面我們來完成一個簡單的LinedList(雙向連結串列),完成add,remove,get方法:
class LinkedList { class Node { int data; Node prio; Node next; public Node() { this.data = -1; this.next = null; this.prio = null; } public Node(int data) { this.data = data; this.next = null; this.prio = null; } } private Node head = null; public LinkedList () { this.head = new Node(); } /** * 頭插法 */ public void add(int val) { Node node = new Node(val); node.next=this.head.next; node.prio=this.head; this.head.next=node; if (node.next != null){ //第一次插入節點的時候 node.next.prio=node; } } /** * 刪除所有值為val的節點 */ public void remove(int val){ Node cur =this.head.next; while (cur.next !=null){ if (cur.data == val){ cur.prio.next=cur.next; if (cur.next != null) { cur.next.prio = cur.prio; } } cur=cur.next; } } /** * 列印函式 */ public void show(){ Node cur = this.head.next; while (cur != null){ System.out.print(" "+cur.data); cur=cur.next; } System.out.println(); } } public class LinkedListDemo { public static void main(String[] args) { LinkedList linkedlist= new LinkedList(); LinkedList .add(10); LinkedList .add(20); LinkedList .add(30); LinkedList .show(); } }
列印結果:
C:\java\java7\jdk1.7.0_80\bin\java.exe -javaagent:D:\ideaIU-
30 20 10
Process finished with exit code 0
ArrayList和LinkedList在效能上各 有優缺點,都有各自所適用的地方,總的說來可以描述如下:
1.對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內部陣列中增加一項,指向所新增的元素,偶爾可能會導致對陣列重新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Node物件。
2.在ArrayList的 中間插入或刪除一個元素意味著這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
3.LinkedList不 支援高效的隨機元素訪問。
4.ArrayList的空 間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間
實現一個簡單的LinkedList的Iterator:
import java.util.Iterator;
/**
* 描述:LinkedList的Iterator的實現
* @Author administrator{GINO ZHANG}
* @Date2018/10/16
*/
public class MyLinkedList implements Iterable{
class Node {
private int data;
private Node next;
public Node(int data, Node next) {
super();
this.data = data;
this.next = next;
}
public Object getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
Node head=null;//頭節點(以後的元素通過next得到)
Node tail=null;//尾節點
int size=0;
/**
* 尾插
* @param val
* @return
*/
public boolean add(int val){
Node node=new Node(val,null);
if(head == null){
head=node;
tail=node;
}
tail.setNext(node);
tail=node;
size++;
return false;
}
public int size(){
return size;
}
@Override
public Iterator iterator(){
return new MyIterator();
}
class MyIterator implements Iterator{
private Node node=head;//節點
@Override
public boolean hasNext() {
if(node.getNext()==null) return false;
else return true;
}
@Override
public Object next() {
Object o=node.getNext().getData();
node=node.getNext();
return o;
}
}
}