List接口的常用方法以及ArrayList/LinkedList源码分析
1.List接口的常用方法
ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("AA");list.add(new Person("Tom",12));System.out.println(list);//[123, 456, AA, Person{name='Tom', age=12}]增:add(int index, object ele): 在index位置插入ele元素;
//void add(int index, object ele): 在index位置插入ele元素list.add(1,"BB");System.out.println(list);//[123, BB, 456, AA, Person{name='Tom', age=12}]刪:remove(int index): 移除指定index位置的元素,并返回此元素;
//object remove(int index): 移除指定index位置的元素,并返回此元素Object obj = list.remove(0);System.out.println(obj);//123,返回刪除的元素System.out.println(list);//[BB, 456, AA, Person{name='Tom', age=12}]改:set(int index, object ele): 設置指定index位置的元素為ele;
//object set(int index, object ele): 設置指定index位置的元素為elelist.set(1,"CC");System.out.println(list);//[BB, CC, AA, Person{name='Tom', age=12}]查:get(int index): 獲取指定index位置的元素;
//object get(int index): 獲取指定index位置的元素System.out.println(list.get(1));//BB插:add(int index, Object ele);
長度:size()
遍歷:①Iterator迭代器方式;
②增強for循環;
③普通for循環(有索引);
2.ArrayList源碼分析:
2.1 jdk7情況:==》類似餓漢式
ArrayList list = new ArrayList(); //底層創建了長度是10的Object[]數組elementData
List.add(123); //elementData[0] = new Integer(123);
…
List.add(11); //如果此次添加到底層elementData數組容量不夠,則需要擴容, 默認情況下,擴容為原來容量的1.5倍,同時需要將原有數組中的數據復制到新的數組中。
結論:開發中建議使用帶參的構造器 ArrayList list = new ArrayList(int capacity);
2.2 jdk8中ArrayList的變化 ==》類似懶漢式
ArrayList list = new ArrayList(); //底層Object[] elementData初始化為{},并沒有創建長度為10的數組
List.add(123); //第一次調用add()時,底層才創建了長度為10的數組,并將數據123添加到elementData數組中。
…后續的添加和擴容操作與jdk7同。
2.3 小結:jdk7中的ArrayList的對象的創建類似于單例模式的餓漢式,jdk8中的ArrayList的對象的創建類似于單例模式的懶漢式,延遲了數組的創建,節省內存。
3.LinkedList源碼分析:內部聲明了Node類型的first和last屬性,默認值為null;
list.add(123);//將123封裝到Node中,創建了Node對象;
其中,Node定義如下:體現了LinkedList的雙向鏈表的說明
4.Vector的源碼分析:jdk7和jdk8中通過Vector()構造器創建對象時,底層都創建了長度為10的數組;擴容方面,默認擴容為原來數組長度的2倍。
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的List接口的常用方法以及ArrayList/LinkedList源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ffmpeg avi 1080P解析 编
- 下一篇: 终于搞明白gluPerspective和