教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Java培訓(xùn)之java難點(diǎn)解析(二十二)-List接口

更新時(shí)間:2016年03月23日17時(shí)59分 來(lái)源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

List本身是Collection接口的子接口,具備了Collection的所有方法?,F(xiàn)在學(xué)習(xí)List體系特有的共性方法,查閱方法發(fā)現(xiàn)List的特有方法都有索引,這是該集合最大的特點(diǎn)。
 
List:有序(元素存入集合的順序和取出的順序一致),元素都有索引。元素可以重復(fù)。
|--ArrayList:底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,線程不同步,ArrayList替代了Vector,查詢?cè)氐乃俣确浅?臁?br /> |--LinkedList:底層的數(shù)據(jù)結(jié)構(gòu)是鏈表,線程不同步,增刪元素的速度非???。
|--Vector:底層的數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,線程同步的,Vector無(wú)論查詢和增刪都巨慢。
 
1,添加:
add(index,element) :在指定的索引位插入元素。
addAll(index,collection) :在指定的索引位插入一堆元素。
2,刪除:
remove(index) :刪除指定索引位的元素。 返回被刪的元素。
3,獲取:
Object get(index) :通過(guò)索引獲取指定元素。
int indexOf(obj) :獲取指定元素第一次出現(xiàn)的索引位,如果該元素不存在返回-1;
  所以,通過(guò)-1,可以判斷一個(gè)元素是否存在。
int lastIndexOf(Object o) :反向索引指定元素的位置。
List subList(start,end) :獲取子列表。
4,修改:
Object set(index,element) :對(duì)指定索引位進(jìn)行元素的修改。
5,獲取所有元素:
ListIterator listIterator():list集合特有的迭代器。
 
List集合支持對(duì)元素的增、刪、改、查。
 
List集合因?yàn)榻菢?biāo)有了自己的獲取元素的方式: 遍歷。
for(int x=0; x<list.size(); x++){
sop("get:"+list.get(x));
}
在進(jìn)行l(wèi)ist列表元素迭代的時(shí)候,如果想要在迭代過(guò)程中,想要對(duì)元素進(jìn)行操作的時(shí)候,比如滿足條件添加新元素。會(huì)發(fā)生.ConcurrentModificationException并發(fā)修改異常。
導(dǎo)致的原因是:
集合引用和迭代器引用在同時(shí)操作元素,通過(guò)集合獲取到對(duì)應(yīng)的迭代器后,在迭代中,進(jìn)行集合引用的元素添加,迭代器并不知道,所以會(huì)出現(xiàn)異常情況。
如何解決呢?
既然是在迭代中對(duì)元素進(jìn)行操作,找迭代器的方法最為合適.可是Iterator中只有hasNext,next,remove方法.通過(guò)查閱的它的子接口,ListIterator,發(fā)現(xiàn)該列表迭代器接口具備了對(duì)元素的增、刪、改、查的動(dòng)作。
 
ListIterator是List集合特有的迭代器。
ListIterator it = list.listIterator;//取代Iterator it = list.iterator;
方法摘要
 void add(E e) 將指定的元素插入列表(可選操作)。
 boolean hasNext() 以正向遍歷列表時(shí),如果列表迭代器有多個(gè)元素,則返回 true(換句話說(shuō),如果 next 返回一個(gè)元素而不是拋出異常,則返回 true)。
 boolean hasPrevious() 如果以逆向遍歷列表,列表迭代器有多個(gè)元素,則返回 true。
 E next() 返回列表中的下一個(gè)元素。
 int nextIndex() 返回對(duì) next 的后續(xù)調(diào)用所返回元素的索引。
 E previous() 返回列表中的前一個(gè)元素。
 int previousIndex() 返回對(duì) previous 的后續(xù)調(diào)用所返回元素的索引。
 void remove() 從列表中移除由 next 或 previous 返回的最后一個(gè)元素(可選操作)。
 void set(E e) 用指定元素替換 next 或 previous 返回的最后一個(gè)元素(可選操作)。
 
可變長(zhǎng)度數(shù)組的原理:
當(dāng)元素超出數(shù)組長(zhǎng)度,會(huì)產(chǎn)生一個(gè)新數(shù)組,將原數(shù)組的數(shù)據(jù)復(fù)制到新數(shù)組中,再將新的元素添加到新數(shù)組中。
ArrayList:是按照原數(shù)組的50%延長(zhǎng)。構(gòu)造一個(gè)初始容量為 10 的空列表。
Vector:是按照原數(shù)組的100%延長(zhǎng)。
 
注意:對(duì)于list集合,底層判斷元素是否相同,其實(shí)用的是元素自身的equals方法完成的。所以建議元素都要復(fù)寫(xiě)equals方法,建立元素對(duì)象自己的比較相同的條件依據(jù)。
 
LinkedList:的特有方法。
addFirst();
addLast();
在jdk1.6以后。
offerFirst();
offerLast();
 
getFirst():獲取鏈表中的第一個(gè)元素。如果鏈表為空,拋出NoSuchElementException;
getLast();
在jdk1.6以后。
peekFirst();獲取鏈表中的第一個(gè)元素。如果鏈表為空,返回null。
peekLast();
 
removeFirst():獲取鏈表中的第一個(gè)元素,但是會(huì)刪除鏈表中的第一個(gè)元素。如果鏈表為空,拋出NoSuchElementException
removeLast();
在jdk1.6以后。
pollFirst();獲取鏈表中的第一個(gè)元素,但是會(huì)刪除鏈表中的第一個(gè)元素。如果鏈表為空,返回null。
pollLast();



本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee 
0 分享到:
和我們?cè)诰€交談!