樂(lè)清 做網(wǎng)站 多少錢(qián)中國(guó)經(jīng)濟(jì)網(wǎng)人事
一、集合
集合是數(shù)據(jù)容器。相較于數(shù)組集合具有以下幾個(gè)特點(diǎn):
- 數(shù)組一旦創(chuàng)建,長(zhǎng)度不可改變。集合的長(zhǎng)度會(huì)自動(dòng)擴(kuò)容。
- 集合具有很多數(shù)組沒(méi)有的功能函數(shù)API
- 數(shù)組元素的存儲(chǔ)特點(diǎn)單一,不同的集合有不同的存儲(chǔ)特點(diǎn)。
1. Collection頂層接口
Collection表示一組對(duì)象,這些對(duì)象也稱為collection的元素。有的是有序的List, 有的是無(wú)序的Set。
Collection c = new ArrayList();//多態(tài)的方式創(chuàng)建一個(gè)Collection類
1.1增刪改查和其他操作
函數(shù) | 作用 |
---|---|
add() | 添加元素 |
remove() | 刪除元素 |
contains() | 判斷是否包含 |
toArray() | 轉(zhuǎn)換成數(shù)組 |
clear() | 清空集合 |
size() | 獲取集合元素個(gè)數(shù) |
retainAll() | 求兩個(gè)集合的交集 |
removeAll() | 求兩個(gè)集合的差集 |
1.2迭代器遍歷
函數(shù) | 作用 |
---|---|
iterator() | 獲取當(dāng)前集合的迭代器對(duì)象 |
hasNext() | 判斷是否有下一個(gè)元素 |
next() | 取出下一個(gè)元素 |
remove() | 移除當(dāng)前元素 |
void test1(){Collection c = new ArrayList();//添加元素c.add("tom");c.add("jack");c.add("rose");c.add("jerry");//獲取迭代器Iterator iterator = c.iterator();while(iterator.hasNext()){Object obj = iterator.next();System.out.println(obj);}}
public
1.3 foreach循環(huán)
foreach增強(qiáng)for循環(huán)是jdk5的新特性,通常用于遍歷數(shù)組和Collection集合。相較于for循環(huán),無(wú)法在遍歷過(guò)程中得到元素的下標(biāo),進(jìn)而無(wú)法直接修改元素,只能讀取元素,但語(yǔ)法形式更為簡(jiǎn)單。
底層是使用迭代器來(lái)實(shí)現(xiàn)的,只有實(shí)現(xiàn)了Iterable接口的類才能使用foreach()來(lái)進(jìn)行遍歷。Collection類繼承了Iterable接口,所以所有集合類都能夠使用foreach和Iterator迭代器來(lái)實(shí)現(xiàn)所有元素的遍歷。
注:實(shí)現(xiàn)了Iterator接口的類都可以使用foreach循環(huán)遍歷。
for(元素類型 變量 :數(shù)組或Collection集合對(duì)象){//循環(huán)體
}//遍歷數(shù)組
int[] arr = {11, 22, 33};
for(int i : arr){System.out.println(i);
}//遍歷集合與上述代碼類似,只是將數(shù)組名稱改為集合名稱
1.4 迭代器的快速失敗機(jī)制
在使用迭代器遍歷集合時(shí), 有外部代碼在同時(shí)修改元素集合,迭代器會(huì)迅速拋出ConcurrentModificationException。
例如,通常不允許一個(gè)線程在另一個(gè)線程迭代Collection時(shí)修改它。通常,在這些情況下,迭代的結(jié)果是不確定的。如果檢測(cè)到這種行為,一些Iterator實(shí)現(xiàn)(包括JRE提供的所有通用集合實(shí)現(xiàn))可能會(huì)選擇拋出此異常。這樣做的迭代器被稱為<快速失敗>迭代器,因?yàn)樗鼈兛焖俣蓛舻厥?#xff0c;而不是在未來(lái)不確定的時(shí)間冒任意的、不確定的行為的風(fēng)險(xiǎn)。
機(jī)制:當(dāng)創(chuàng)建迭代器時(shí),會(huì)使用變量modCount記錄當(dāng)前集合的修改次數(shù)。每次取出元素前都會(huì)檢查判斷該變量是否修改過(guò),如果修改過(guò),立即拋出異常。該機(jī)制并不能完全保證不會(huì)有外部代碼修改元素。
void test1(){Collection c = new ArrayList();//添加元素c.add("tom");c.add("jack");c.add("rose");//倒數(shù)第二個(gè)不會(huì)拋出異常c.add("jerry");//獲取迭代器Iterator iterator = c.iterator();while(iterator.hasNext()){//遍歷Object obj = iterator.next();if("jack".equals(obj)){//c.remove(obj);//集合的remove方法//迭代器自身的remove方法iterator.remove();}//System.out.println(obj);}System.out.println(c);}
public
2. List子接口
Collection有兩個(gè)子接口,分別是List和Set。List集合的特點(diǎn)主要是以下幾點(diǎn):
- 元素是有序的
- 元素可以重復(fù),Set集合不允許重復(fù)
- 可以通過(guò)索引訪問(wèn)元素
2.1 特有方法
List繼承了父類Collection的方法,此外特有的方法都是通過(guò)下標(biāo)找到指定位置來(lái)訪問(wèn)數(shù)據(jù)而增加的方法。
//截取一個(gè)子集合List subList = list.subList(0,2);System.out.println("subList = " + subList);//獲取元素首次出現(xiàn)的位置int java = list.indexOf("java");System.out.println(java);//刪除指定索引位置的元素Object remove = list.remove(1);//返回被刪除的元素System.out.println("remove = " + remove);//替換指定位置的元素,返回被替換的元素Object java1 = list.set(1, "JAVA");System.out.println("java1 = " + java1);
2.2 List集合的遍歷
- 迭代器遍歷:可以使用迭代器的remove方法進(jìn)行刪除。
- 增強(qiáng)for循環(huán):無(wú)法修改集合里面的元素
- 普通for循環(huán):可刪除,可修改。
- ListIterator迭代器
- 普通for循環(huán):
2.3 ListIterator迭代器
Iterator接口的子接口,增加了(添加元素、修改元素、判斷是否有上一個(gè)元素、取出上一個(gè)元素) 這幾個(gè)方法。并且它的構(gòu)造器可以定義遍歷的開(kāi)始位置。
//從第二個(gè)位置開(kāi)始遍歷
ListIterator iterator= new ListIterator(2);
查看是否有上一個(gè)元素:該方法是ListIterator特有的方法,使用該方法可以倒著遍歷整個(gè)List集合。
iterator.hasPrevious();
3. ArrayList類
使用空參構(gòu)造器創(chuàng)建對(duì)象,底層數(shù)組容量為0。第一次添加元素時(shí),初始化容量為10。當(dāng)放入數(shù)據(jù)大于初始容量時(shí),數(shù)組擴(kuò)容為原容量的1.5倍。增刪時(shí)如果容量不足,需要?jiǎng)討B(tài)擴(kuò)容,效率不高,查詢時(shí)直接通過(guò)數(shù)組索引查詢,效率高。
特點(diǎn):
- 元素有序可重復(fù),可以通過(guò)索引訪問(wèn)
- 底層結(jié)構(gòu):
- 數(shù)組
- 增刪慢,索引查找速度快
4. Vector類
底層也是數(shù)組實(shí)現(xiàn)的,線程安全的。ArrayList是線程不安全的。數(shù)組容量不足時(shí),容量擴(kuò)充到原先的2倍。效率低,不推薦使用。