常見(jiàn)集合與應(yīng)用
什么是集合
java集合類(lèi)是一種特別有用的工具類(lèi),可用于存儲(chǔ)數(shù)量不等的對(duì)象
Java集合包含List(列表)绿贞、Set(集合)因块、Map(映射)以及JDK1.5推出的Quene(隊(duì)列)四種體系
Java的集合類(lèi)主要由兩個(gè)接口派生而出:Collection(所有單數(shù)據(jù)最頂層的抽象接口)和Map(映射數(shù)據(jù)結(jié)構(gòu)最頂層的接口)
四種存儲(chǔ)結(jié)構(gòu)
- List代表有序、可重復(fù)集合
- Quene代表隊(duì)列特性
- Set代表無(wú)序籍铁、不可重復(fù)集合
- Map代表存儲(chǔ)映射關(guān)系的集合
Collection接口及實(shí)現(xiàn)
Map接口及實(shí)現(xiàn)
List接口與ArrayList實(shí)現(xiàn)類(lèi)
List集合
- List集合代表一個(gè)元素有序涡上、可重復(fù)的集合、集合中每個(gè)元素都有其對(duì)應(yīng)的順序索引
- List集合允許使用重復(fù)元素拒名,通過(guò)縮影訪問(wèn)指定位置的元素
- List集合默認(rèn)按元素的添加順序設(shè)置元素的索引
Array與LinkedList
ArrayList吩愧、LinkedList、Vector增显、Stack都是List接口的實(shí)現(xiàn)類(lèi)
ArrayList也就是替代數(shù)組用的列表
LinkedList是基于鏈表數(shù)據(jù)結(jié)構(gòu)所產(chǎn)生的列表
ArrayList的特點(diǎn)
- ArrayLIst基于數(shù)組實(shí)現(xiàn)的list類(lèi)雁佳,是Java數(shù)組的有效替代品
- ArrayList會(huì)自動(dòng)對(duì)容量進(jìn)行擴(kuò)容,多數(shù)情況下無(wú)須指定最大長(zhǎng)度
- ArrayList的數(shù)據(jù)在內(nèi)存中是連續(xù)緊密存儲(chǔ)的同云,基于數(shù)據(jù)訪問(wèn)速度快
ArrayList的使用方法
//集合存儲(chǔ)在Java.util包下
import java.util.ArrayList;
...
//實(shí)例化ArrayList
ArrayList<String>bookList = new ArrayList<String>();
//新增元素糖权,尾部追加
bookList.add("三國(guó)演義");
//返回第一個(gè)元素,索引從0開(kāi)始
String bookName1 = bookList.get(0);
...
< String >表示在bookList里未來(lái)的數(shù)據(jù)都是一個(gè)一個(gè)字符串 這種書(shū)寫(xiě)方式稱為泛型梢杭,泛型的作用就是約束列表中每一項(xiàng)元素的類(lèi)型
add(String e)是在尾部添加數(shù)據(jù)温兼,返回值是Boolean類(lèi)型,表示列表是否發(fā)生了變化
//add方法返回值代表List集合是否發(fā)生變化
boolean result1 = bookList.add("西游記");
System.out.println("列表是否發(fā)生變化:" + result1);
結(jié)果:列表是否發(fā)生變化:true
add(int index,String element)是在下標(biāo)為index添加element武契,
get()是獲取的意思 括號(hào)里填的是元素的下標(biāo)募判,如果輸入了不存在的下標(biāo),就會(huì)報(bào)IndexOutOfBoundsException的錯(cuò)誤
在IDEA中咒唆,輸入psvm就能快捷創(chuàng)建一個(gè)main()方法了届垫,輸入sout就是自動(dòng)生成一個(gè)輸出換行語(yǔ)句:System.out.println();,ctrl+d :復(fù)制當(dāng)前行到下一行
快捷鍵**ctrl+shift+回車(chē)**快捷在句尾添加分號(hào)(如果沒(méi)有分號(hào)的話)全释,如果有分號(hào)的話在按一遍就會(huì)轉(zhuǎn)到下一行
set(int index,String element)
更新設(shè)置的意思装处,返回值是String,表示更新之前原始數(shù)據(jù)是什么
//set方法用于更新指定索引的數(shù)據(jù)浸船,返回值是更新前的原數(shù)據(jù)
String before = bookList.set(3,"西游記后傳");
System.out.println(before);
System.out.println(bookList);
結(jié)果:
西游記
[三國(guó)演義, 紅樓夢(mèng), 水滸傳, 西游記后傳]
remove()
有兩種使用方式妄迁,第一種就是刪除具體的數(shù)據(jù),第二種是根據(jù)具體的位置來(lái)進(jìn)行刪除,第一種返回值為Boolean類(lèi)型李命,表示是否找到需要?jiǎng)h除的數(shù)據(jù)并刪除登淘,第二種返回值是被刪除的數(shù)據(jù)
//remove方法有兩種形式
//按數(shù)據(jù)刪除,傳入數(shù)據(jù)封字,返回是否刪除成功的布爾類(lèi)型
boolean result2 = bookList.remove("西游記后傳");
System.out.println(result2);
System.out.println(bookList);
//按索引位置刪除黔州,返回被刪除的數(shù)據(jù)
String item = bookList.remove(0);
System.out.println(item);
System.out.println(bookList);
結(jié)果:
true
[三國(guó)演義, 紅樓夢(mèng), 水滸傳]
三國(guó)演義
[紅樓夢(mèng), 水滸傳]
size()
作用是返回該列表元素的數(shù)量耍鬓,返回值是int
//size方法用于獲取List集合的總長(zhǎng)度
int count = bookList.size();
System.out.println(count);
結(jié)果: 2
size()方法也可和其他方法搭配使用
例如:需要更新列表最后一個(gè)數(shù)據(jù)
//更新最后一個(gè)數(shù)據(jù)
bookList.set(bookList.size() - 1, "測(cè)試數(shù)據(jù)");
System.out.println(bookList);
結(jié)果:[紅樓夢(mèng), 測(cè)試數(shù)據(jù)]
刪除列表最后一個(gè)數(shù)據(jù)
//刪除最后一個(gè)數(shù)據(jù)
bookList.remove(bookList.size() - 1);
System.out.println(bookList);
結(jié)果:[紅樓夢(mèng)]
LinkedList特征與方法應(yīng)用
特點(diǎn):
- LinkedList同時(shí)實(shí)現(xiàn)了List與Deque(雙端隊(duì)列)兩個(gè)接口
- LinkedList在保障有序、允許重復(fù)的前提下流妻,也可以作為隊(duì)列在隊(duì)首牲蜀、隊(duì)尾快速追加數(shù)據(jù)(在數(shù)據(jù)寫(xiě)操作的時(shí)候效率要比前面的ArrayLIst效率要高一些)
- LinkedList的數(shù)據(jù)在內(nèi)存中是分散存儲(chǔ)的,基于鏈表绅这,擁有良好的數(shù)據(jù)插入速度涣达,但數(shù)據(jù)訪問(wèn)低于ArrayList
LinkedList和ArrayList的add()使用辦法完全相同
Deque 雙端隊(duì)列接口
無(wú)論是在隊(duì)列的頭還是隊(duì)列的尾都能追加數(shù)據(jù),提供addFirst() 在隊(duì)列的首部新增一個(gè)元素君躺、addlast()方法 在隊(duì)列的尾部新增一個(gè)元素
ArrayList與LinkedList存儲(chǔ)結(jié)構(gòu)
ArrayList是開(kāi)辟一段連續(xù)的空間來(lái)存取數(shù)據(jù)峭判,遍歷一遍的速度比LinkedList快,但是如果是插入數(shù)據(jù)時(shí)棕叫,ArrayList會(huì)在把數(shù)據(jù)放入相應(yīng)位置之后林螃,之后位置上的數(shù)據(jù)都要往后挪一位
LinkedList是通過(guò)指針的方式來(lái)存取數(shù)據(jù)的,在數(shù)據(jù)存放的地方加上指向上一個(gè)數(shù)據(jù)位置和指向下一個(gè)數(shù)據(jù)位置的指針俺泣,這樣插入數(shù)據(jù)就會(huì)比ArrayList快疗认。
三種集合的遍歷方式
-
for循環(huán)遍歷
for(類(lèi)型 對(duì)象名 : 相應(yīng)集合的對(duì)象){}
for(String book : bookList){ System.out.println(book); }
可以依次對(duì)所有集合中的數(shù)據(jù)進(jìn)行提取并且賦值給前面這個(gè)對(duì)象,開(kāi)發(fā)中最常見(jiàn)
-
forEach方法遍歷
利用對(duì)象自帶的forEach(對(duì)象名->){
//相應(yīng)的處理語(yǔ)句
}
//方式2:利用forEach方法+Lambda表達(dá)式簡(jiǎn)化循環(huán)過(guò)程 bookList.forEach(book->{ System.out.println(book); });
-
Iterator迭代器遍歷
在List這個(gè)對(duì)象中提供了專門(mén)用來(lái)遍歷集合的對(duì)象伏钠,名字叫做迭代器横漏,通過(guò)迭代器可以完成數(shù)據(jù)的遍歷和獲取的任務(wù)
interator()返回的也是一個(gè)interator對(duì)象,也要通過(guò)泛型來(lái)進(jìn)行接收熟掂,保證和前面每一個(gè)元素類(lèi)型一致
hasNext() 作用判斷是否還有下一個(gè)元素缎浇,如果有就返回true
next()作用是獲取下一個(gè)元素,返回值適合之前定義的對(duì)象保持一致
//方式3:利用Iterator迭代器對(duì)象循環(huán)輸出 Iterator<String> itr = bookList.iterator(); while (itr.hasNext()){ String book = itr.next();//提取出下一個(gè)元素赴肚,同時(shí)將指針向后移動(dòng) System.out.println(book); }