java liste_内功心法 -- java.util.ArrayListE (1)
寫在前面的話:讀書破萬卷,編碼如有神
--------------------------------------------------------------------
下文主要對java.util.ArrayList進(jìn)行整體性介紹,主要內(nèi)容包括:
1、 ArrayList概述
2、 ArrayList中的屬性、構(gòu)造方法、常用方法介紹
3、 ArrayList遍歷
參考內(nèi)容:
1、JDK源碼(1.7)
--------------------------------------------------------------------
1. ArrayList概述
java.util.ArrayList是一個(gè)什么玩意,它有什么功能,我們拿ArrayList能夠干嘛?
簡單點(diǎn)說:java.util.ArrayList是一個(gè)列表類,它是用來存放其他Java對象,內(nèi)部是通過數(shù)組來實(shí)現(xiàn)的。
先看下面的圖(簡略圖):
(1)java.util.ArrayList 是一個(gè)列表,用來存放其它java對象的,只要是java對象就可以往ArrayList里面放
(2)java.util.ArrayList內(nèi)部是通過數(shù)組來實(shí)現(xiàn)的:
當(dāng)數(shù)組容量不夠的時(shí)候,會(huì)對數(shù)組容量進(jìn)行擴(kuò)容
可以通過數(shù)組下標(biāo)來快速的訪問ArrayList里面的元素
當(dāng)新增或者刪除ArrayList里面的元素時(shí),可能會(huì)涉及到移位操作
可以截取數(shù)組的子數(shù)組操作
java.util.ArrayList的定義如下:
1 public class ArrayList extends AbstractList
2 implements List, RandomAccess, Cloneable, java.io.Serializable{3 //fields4
5 //constructor6
7 //methods8
9 //inner class 'Itr'10
11 //inner class 'ListItr'12
13 //inner class 'SubList'
14 }
從ArrayList類的定義中可以看到,它好復(fù)雜喲,定義了那么多的東西,又有父類,又實(shí)現(xiàn)了接口等等,這都要怪它的'祖宗',定義了那么多的規(guī)范、規(guī)則。(@_@)
好了,不多廢話,擼起袖子繼續(xù)干:
下面來看看一副圖:
2. ArrayList中的屬性、構(gòu)造方法、常用方法介紹
先來對java.util.ArrayList的描述進(jìn)行一些約定:
下面文中的:
'列表'代表ArrayList內(nèi)部的Object[] elementData數(shù)組
'列表大小'代表ArrayList內(nèi)部的Object[] elementData數(shù)組的長度
'元素'代表往ArrayList中添加的Java對象
2.1 java.util.ArrayList的常見屬性
1 //序列號
2 private static final long serialVersionUID = 8683452581122892189L;3 //ArrayList實(shí)際存儲元素的地方
4 private transientObject[] elementData;5 //ArrayList中存儲的元素個(gè)數(shù)
6 private intsize;7 //ArrayList最多存儲元素的個(gè)數(shù)
8 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;9 //fast-fail失敗機(jī)制標(biāo)記
10 protected transient int modCount = 0;
2.2?java.util.ArrayList的構(gòu)造方法
第一種:默認(rèn)構(gòu)造方法(無參數(shù)構(gòu)造方法)
1 publicArrayList()
第二種: 帶初始列表容量大小參數(shù)的構(gòu)造方法
1 public ArrayList(intinitialCapacity)
第三種:帶初始化子列表參數(shù)的構(gòu)造方法
1 public ArrayList(Collection extends E>c)
2.3?java.util.ArrayList的常用方法
修改操作
boolean add(E e)
將指定的元素添加到此列表的尾部
void add(int index,E element)
將指定的元素插入此列表中的指定位置
E remove(int index)
移除此列表中指定位置上的元素
boolean remove(Object o)
移除此列表中首次出現(xiàn)的指定元素
E set(int index,E element)
用指定的元素替代此列表中指定位置上的元素
批量操作
boolean addAll(Collection extends E> c)
將子集合c中的元素添加到此集合中
boolean addAll(int index,Collection extends E> c)
將子集合c中的元素添加到此集合中的index位置開始處
void clear()
清空此集合
protected void removeRange(int fromIndex,int toIndex)
移除集合中索引在fromIndex(包括)和toIndex(不包括)之間的所有元素
public boolean removeAll(Collection> c)
移除此collection中那些也包含在指定collection中的所有元素
public boolean retainAll(Collection> c)
僅保留在子集合c中那些也包含在此集合中的元素
查詢操作
boolean contains(Object o)
判斷集合中是否包含了元素o
E get(int index)
返回此集合中index位置上的元素
int indexOf(Object o)
返回此集合中首次出現(xiàn)元素o的位置
boolean isEmpty()
判斷此集合是否為空
int lastIndexOf(Object o)
返回此集合中最后一次出現(xiàn)元素o的位置
int size()
返回此集合中元素的個(gè)數(shù)
其他操作
Object clone()
返回此列表實(shí)例的淺復(fù)制
void ensureCapaCity(int minCapacity)
如有必要,增加此列表實(shí)例的容量,以確保它至少能夠容納最小容量參數(shù)所指定的元素?cái)?shù)
void trimToSize()
將此列表實(shí)例的容量調(diào)整為列表的當(dāng)前大小
數(shù)組操作
Object[] toArray()
按適當(dāng)順序返回包含此列表中所有元素的數(shù)組
T[] toArray(T[] a)
按適當(dāng)順序返回包含此列表中所有元素的數(shù)組
Iterator和子List操作
ListIterator listIterator(int index)
返回列表的ListIterator實(shí)例
ListIterator listIterator()
返回列表的ListIterator實(shí)例
Iterator iterator()
返回列表的Iterator實(shí)例
List subList(int fromIndex, int toIndex)
返回列表的子列表
----------------------------------------------------------------------------------------
3. ArrayList遍歷方法
java.util.ArrayList支持三種遍歷方式:
第一種: 通過索引值去遍歷(隨機(jī)遍歷)
第三種: 通過增強(qiáng)的for循環(huán)去遍歷
第三種: 通過迭代器去遍歷
下面就來看看三種遍歷方式的示例代碼和遍歷的效率比較:
1 importjava.util.ArrayList;2 importjava.util.Iterator;3 importjava.util.List;4
5
6 public classArrayListAccessDemo {7 /**
8 * 通過索引值去遍歷(隨機(jī)訪問)9 */
10 public static void accessByIndex(Listlist){11 long beginTime =System.currentTimeMillis();12 for(int i = 0;i < list.size();i++){13 list.get(i);14 }15 long endTime =System.currentTimeMillis();16 long totalTime = endTime -beginTime;17 System.out.println("通過索引值去遍歷(隨機(jī)訪問) 花費(fèi)的時(shí)間:" + totalTime+" 毫秒");18
19 }20
21 /**
22 * 通過增強(qiáng)的for循環(huán)去遍歷23 */
24 public static void accessByFor(Listlist){25 long beginTime =System.currentTimeMillis();26 for(Integer i : list){27 list.get(i);28 }29 long endTime =System.currentTimeMillis();30 long totalTime = endTime -beginTime;31 System.out.println("通過增強(qiáng)的for循環(huán)去遍歷 花費(fèi)的時(shí)間:" + totalTime+" 毫秒");32
33 }34
35 /**
36 * 通過Iterator迭代器去遍歷37 */
38 public static void accessByIterator(Listlist){39 long beginTime =System.currentTimeMillis();40 Iterator it =list.iterator();41 while(it.hasNext()){42 it.next();43 }44 long endTime =System.currentTimeMillis();45 long totalTime = endTime -beginTime;46 System.out.println("通過Iterator迭代器去遍歷 花費(fèi)的時(shí)間:" + totalTime+" 毫秒");47
48 }49
50 public static voidmain(String[] args) {51 //創(chuàng)建一個(gè)ArrayList實(shí)例
52 List list = new ArrayList();53 //往ArrayList實(shí)例中添加數(shù)據(jù)
54 for(int i = 0;i < 10000000;i++){55 list.add(i);56 }57
58 accessByIndex(list);59 accessByFor(list);60 accessByIterator(list);61 }62 }63
64 運(yùn)行結(jié)果:65 ArrayList中有100W條數(shù)據(jù)時(shí):66 通過索引值去遍歷(隨機(jī)訪問) 花費(fèi)的時(shí)間:2毫秒67 通過增強(qiáng)的for循環(huán)去遍歷 花費(fèi)的時(shí)間:9毫秒68 通過Iterator迭代器去遍歷 花費(fèi)的時(shí)間:4毫秒69
70 ArrayList中有500W條數(shù)據(jù)時(shí):71 通過索引值去遍歷(隨機(jī)訪問) 花費(fèi)的時(shí)間:4毫秒72 通過增強(qiáng)的for循環(huán)去遍歷 花費(fèi)的時(shí)間:20毫秒73 通過Iterator迭代器去遍歷 花費(fèi)的時(shí)間:9毫秒74
75 ArrayList中有1000W條數(shù)據(jù)時(shí):76 通過索引值去遍歷(隨機(jī)訪問) 花費(fèi)的時(shí)間:3毫秒77 通過增強(qiáng)的for循環(huán)去遍歷 花費(fèi)的時(shí)間:32毫秒78 通過Iterator迭代器去遍歷 花費(fèi)的時(shí)間:13毫秒79
80 ArrayList中有5000W條數(shù)據(jù)時(shí):81 通過索引值去遍歷(隨機(jī)訪問) 花費(fèi)的時(shí)間:3毫秒82 通過增強(qiáng)的for循環(huán)去遍歷 花費(fèi)的時(shí)間:118毫秒83 通過Iterator迭代器去遍歷 花費(fèi)的時(shí)間:55 毫秒
View Code
----------------------------------------------------------------------------------------
java.util.ArrayList系列文章
相關(guān)知識
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java liste_内功心法 -- java.util.ArrayListE (1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu终端显示乱码的解决
- 下一篇: 重载输入运算符