vue雙向資料繫結原理
阿新 • • 發佈:2021-01-15
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));
}