模拟实现ArrayList与 LinkedList
生活随笔
收集整理的這篇文章主要介紹了
模拟实现ArrayList与 LinkedList
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可參考文章:ArrayList 與 LinkedList 底層實現分析
我們知道ArrayList 底層使用數組實現的,了解ArrayList 的實現原理之后,我們就可以通過代碼去簡單模擬實現其中的過程。
public class MyArrayList {Object [] elementDate = new Object[4];//數組中包含的非null 數據的大小public int size = 0;public void add(Object value){//當數組長度不夠時進行擴容,長度為原數組非null 容量的兩倍if(size >= elementDate.length){//完成數組的拷貝,實現擴容Object[] temp = new Object[size * 2];for(int i = 0; i< elementDate.length; i++)temp[i] = elementDate[i];elementDate = temp;}elementDate[size] = value;size ++;}//在操作集合時進行下標檢查public void rangeCheck(int index){if(index >= size || index < 0)throw new IndexOutOfBoundsException("下標越界");}public Object get(int index){rangeCheck(index);return elementDate[index];}public void set(int index,Object value){rangeCheck(index);elementDate[index] = value;}public void clear(){//將數據清空,執行GC,釋放內存,增加效率for (int i = 0; i < size; i++)elementDate[i] = null;size = 0;}public void remove(int index){rangeCheck(index);//以傳入的下標為基準,將后面的所有數據向前移動一個單位for(int i=index; i<size; i++)elementDate[i] = elementDate[i+1];elementDate[size--] = null;}@Testpublic void testMyArrayList(){MyArrayList arrayList = new MyArrayList();for(int i=0; i<10; i++)arrayList.add(i);arrayList.remove(0);arrayList.set(0,100);for (int i=0; i<arrayList.size; i++)System.out.print(arrayList.get(i) + " ");System.out.println();arrayList.clear();System.out.println(arrayList.size);} }輸出
100 2 3 4 5 6 7 8 9
0
通過單向鏈表模擬實現LinkedList,這里使用了單向鏈表簡單實現了LinkedList 的一些方法。PS :LinkedList 底層使用了雙向鏈表。
import org.junit.Test;public class MyLinkedList {//頭結點public Node head = null;//鏈表元素個數public int size = 0;public void add(Object value){Node node = new Node(value);if(head == null){head = node;}else{Node temp = head;while(temp.getNext() != null){temp = temp.getNext();}temp.setNext(node);}size ++;}//下標檢查public void checkElementIndex(int index){if(index >= size || index < 0)throw new IndexOutOfBoundsException("下標越界");}public Object get(int index){checkElementIndex(index);//根據頭結點找到當前節點,返回節點值Node temp = head;for(int i=0; i<index; i++){temp = temp.getNext();}return temp.getValue();}public void set(int index,Object value){checkElementIndex(index);//根據頭結點找到當前節點,設置當前節點值Node temp = head;for(int i=0; i<index; i++){temp = temp.getNext();}temp.setValue(value);}//只需要讓頭結點為null 由于后續節點再無引用,會被GC 收集,因此效率很高public void clear(){head = null;size = 0;}public void remove(int index){checkElementIndex(index);//如果是頭結點,讓頭結點變成頭結點后的一個節點if(index == 0){head = head.getNext();}else{Node temp = head;//找到刪除元素節點的前一個節點,改變其后繼節點for(int i=0; i<index - 1; i++){temp = temp.getNext();}temp.setNext(temp.getNext().getNext());}size --;}//內部類,模擬單向鏈表,保存元素值與下一個節點private static class Node{private Object value;private Node next;Node(Object value){this.value = value;}public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}}@Testpublic void testMyLinkedList(){MyLinkedList linkedList = new MyLinkedList();for(int i=0; i<10; i++)linkedList.add(i);linkedList.remove(0);linkedList.set(0,100);for (int i=0; i<linkedList.size; i++)System.out.print(linkedList.get(i) + " ");System.out.println();linkedList.clear();System.out.println(linkedList.size);} }輸出
100 2 3 4 5 6 7 8 9
0
??????這里只是運用其中的思想簡單的模擬實現了ArrayList 與LinkedList ,源碼中的ArrayList 與LinkedList 實現要比這復雜的多。如果小伙伴們有興趣可以去查看底層的實現源碼,想必一定會有收獲。
總結
以上是生活随笔為你收集整理的模拟实现ArrayList与 LinkedList的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在农村开熟食店怎么样 经济好了消费也上去
- 下一篇: 今年农村干什么最赚钱 利润高的项目是该多