1. 程式人生 > 其它 >vue雙向資料繫結原理

vue雙向資料繫結原理

List介面框架

 *    |----Collection介面:單列集合,用來儲存一個一個的物件
 *          |----List介面:儲存有序的、可重複的資料。  -->“動態”陣列,替換原有的陣列
 *              |----ArrayList:作為List介面的主要實現類;執行緒不安全的,效率高;底層使用Object[] elementData儲存
 *              |----LinkedList:對於頻繁的插入、刪除操作,使用此類效率比ArrayList高;底層使用雙向連結串列儲存
 *              |----Vector:作為List介面的古老實現類;執行緒安全的,效率低;底層使用Object[] elementData儲存

ArrayList的原始碼分析

/**  1 jdk 7情況下
 *      //底層建立了長度是10的Object[]陣列elementData
 *      ArrayList list = new ArrayList();
 *      //elementData[0] = new Integer(123);
 *      list.add(123);
 *      ...
 *     //如果此次的新增導致底層elementData陣列容量不夠,則擴容。預設情況下,擴容為原來的容量的1.5倍,同時需要將原有陣列中的資料複製*到新的陣列中。
 *      list.add(11);
 *
 *      結論:建議開發中使用帶參的構造器:ArrayList list = new ArrayList(int capacity)
 *
 *  2 jdk 8中ArrayList的變化:
 *      ArrayList list = new ArrayList();//底層Object[] elementData初始化為{}.並沒有建立長度為10的陣列
 *
 *      list.add(123);//第一次呼叫add()時,底層才建立了長度10的陣列,並將資料123新增到elementData[0]
 *      ...
 *      後續的新增和擴容操作與jdk 7 無異。
 *   2.3 小結:jdk7中的ArrayList的物件的建立類似於單例的餓漢式,而jdk8中的ArrayList的物件
 *            的建立類似於單例的懶漢式,延遲了陣列的建立,節省記憶體。
 **/

LinkedList的原始碼分析

LinkedList list = new LinkedList();
//內部聲明瞭Node型別的first和last屬性,預設值為null
list.add(123);//將123封裝到Node中,建立了Node物件。

//其中,Node定義為:體現了LinkedList的雙向連結串列的說法
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;
             }
         }

Vector的原始碼分析

jdk7和jdk8中通過Vector()構造器建立物件時,底層都建立了長度為10的陣列。
在擴容方面,預設擴容為原來的陣列長度的2倍。

面試題

面試題:ArrayList、LinkedList、Vector三者的異同?
同:三個類都是實現了List介面,儲存資料的特點相同:儲存有序的、可重複的資料
不同:見上

List介面中的常用方法

//在index位置插入ele元素
void add(int index, Object ele)   

//從index位置開始將eles中的所有元素新增進來
boolean addAll(int index, Collection eles)

//獲取指定index位置的元素
Object get(int index)

//返回obj在集合中首次出現的位置
int indexOf(Object obj)

//返回obj在當前集合中末次出現的位置
int lastIndexOf(Object obj)

//移除指定index位置的元素,並返回此元素
Object remove(int index)

//設定指定index位置的元素為ele
Object set(int index, Object ele)

//返回從fromIndex到toIndex位置的子集合
List subList(int fromIndex, int toIndex)

總結
增:add(Object obj)
刪:remove(int index) / remove(Object obj)
改:set(int index, Object ele)
查:get(int index)
插:add(int index, Object ele)
長度:size()
遍歷:① Iterator迭代器方式
      ② 增強for迴圈
      ③ 普通的迴圈
      
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        //方式一:Iterator迭代器方式
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

        System.out.println("***************");

        //方式二:增強for迴圈
        for(Object obj : list){
            System.out.println(obj);
        }

        System.out.println("***************");

        //方式三:普通for迴圈
        for(int i = 0;i < list.size();i++){
            System.out.println(list.get(i));
        }