版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
day16集合-List、Set集合教學(xué)任務(wù) 1、List的子類 1.1、數(shù)據(jù)結(jié)構(gòu) 1)隊(duì)列、棧 2)數(shù)組、鏈表 1.2、ArrayList 1.3、LinkedList 1.4、vector 2、Set 2.1、Set接口 1)特點(diǎn) 2)存儲(chǔ)字符串并遍歷 2.2、HashSet 1)特點(diǎn) 2)哈希表結(jié)構(gòu) 3)HashSet存儲(chǔ)自定義對(duì)象 4)總結(jié) 2.3、LinkedHashSet 1)特點(diǎn) 2)演示 2.4、TreeSet 1)特點(diǎn) 2)存儲(chǔ)數(shù)字演示 3)樹結(jié)構(gòu)介紹 4)存儲(chǔ)自定義對(duì)象 5)Comparable接口 6)自定義Comparator 3、Collection體系總結(jié) 4、練習(xí)昨日回顧課堂筆記List的子類List的特點(diǎn): A:存取有序 B:元素有索引 C:元素可以重復(fù)數(shù)據(jù)結(jié)構(gòu)1)隊(duì)列和棧結(jié)構(gòu)2)數(shù)組結(jié)構(gòu)和鏈表結(jié)構(gòu)ArrayList1)特點(diǎn) A:List的特點(diǎn)都有 B:底層是數(shù)組 C:查詢快、增刪慢 D:線程不安全,因此效率高2)練習(xí)用ArrayList存儲(chǔ)字符串,并且遍歷/**演示:用ArrayList存儲(chǔ)字符串,并且遍歷*/publicclassArrayListDemo01{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 ArrayListal=newArrayList(); //創(chuàng)建并添加元素 al.add("hello"); al.add("world"); al.add("java"); //遍歷集合 Iteratorit=al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }}用ArrayList存自定義對(duì)象,并且遍歷/**演示:用ArrayList存自定義對(duì)象,并且遍歷**/publicclassArrayListDemo02{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 ArrayListal=newArrayList(); //創(chuàng)建并添加元素 al.add(newStudent("柳巖",21)); al.add(newStudent("虎哥",30)); al.add(newStudent("范冰冰",24)); al.add(newStudent("劉亦菲",18)); al.add(newStudent("王祖賢",25)); //遍歷集合 for(Objectobj:al){ Students=(Student)obj; System.out.println(s.getName()+"--"+s.getAge()); } }}Vector1)介紹特點(diǎn): A:List的所有特點(diǎn) B:底層是數(shù)組 C:查詢快、增刪慢 D:線程是安全的,因此效率低2)特有功能voidaddElement(Objectobj)將指定的元素添加到此向量的末尾ObjectelementAt(intindex)返回指定索引處的元素。Enumerationelements()返回此向量的組件的枚舉。/**演示:Vector的特有功能:* voidaddElement(Objectobj)將指定的元素添加到此向量的末尾* ObjectelementAt(intindex)返回指定索引處的元素。* Enumerationelements()返回此向量的組件的枚舉。* booleanhasMoreElements()測(cè)試此枚舉是否包含更多的元素。* ObjectnextElement()返回下一個(gè)元素*/publicclassVectorDemo01{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 Vectorv=newVector(); //創(chuàng)建并添加元素 //voidaddElement(Objectobj)將指定的元素添加到此向量的末尾 v.addElement("hello"); v.addElement("world"); v.addElement("java"); //遍歷集合 for(inti=0;i<v.size();i++){ //ObjectelementAt(intindex)返回指定索引處的元素。 Objectobj=v.elementAt(i); System.out.println(obj); } //Enumerationelements()返回此向量的組件的枚舉。 Enumerationen=v.elements(); while(en.hasMoreElements()){ Objectobj=en.nextElement(); System.out.println(obj); } }}LinkedList概述特點(diǎn): A:List的所有特點(diǎn) B:底層是鏈接表 C:查詢慢、增刪快 D:線程不安全,因此效率高 特有方法增加了與頭和尾相關(guān)的操作:voidaddFirst(Objecte)將指定元素插入此列表的開頭。ObjectgetFirst()返回此列表的第一個(gè)元素。ObjectremoveFirst()移除并返回此列表的第一個(gè)元素。/**演示:LinkedList的特有功能:* voidaddFirst(Objecte)將指定元素插入此列表的開頭。* ObjectgetFirst()返回此列表的第一個(gè)元素。* ObjectremoveFirst()移除并返回此列表的第一個(gè)元素。*/publicclassLinkedListDemo01{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 LinkedListll=newLinkedList(); //創(chuàng)建并添加元素 ll.add("hello"); ll.add("world"); ll.add("java"); //voidaddFirst(Objecte)將指定元素插入此列表的開頭。 ll.addFirst("柳巖"); //ObjectgetFirst()返回此列表的第一個(gè)元素。 System.out.println(ll.getFirst()); System.out.println("----------------"); //ObjectremoveFirst()移除并返回此列表的第一個(gè)元素。 System.out.println(ll.removeFirst()); System.out.println("---------------------------"); //遍歷集合 for(Objectobj:ll){ System.out.println(obj); } }}面試題1)使用LinkedList模擬棧結(jié)構(gòu)集合(面試題)棧結(jié)構(gòu)集合:/***這是一個(gè)棧結(jié)構(gòu)的集合,我可以實(shí)現(xiàn)先進(jìn)后出,我對(duì)外提供添加和獲取功能*@author虎哥*@version1.0*/publicclassMyStack{ /* *我們這是一個(gè)集合,要對(duì)外提供添加功能。我們就需要把元素存儲(chǔ)到一個(gè)容器中。我們有容器嗎?現(xiàn)在沒有,必須創(chuàng)建一個(gè)容器。我們創(chuàng)建什么容器呢? *因?yàn)槲覀兪且粋€(gè)集合,又要實(shí)現(xiàn)棧結(jié)構(gòu),所以我們創(chuàng)建一個(gè)LinkedList,當(dāng)做我們的容器。 *添加元素時(shí),就添加到這個(gè)集合中,然后取元素時(shí),從這個(gè)集合取。 */ privateLinkedListll=newLinkedList(); publicvoidadd(Objectobj){ ll.addFirst(obj); } publicObjectget(){ //returnll.getFirst(); //為了一次取出一個(gè),依次取出所有元素,所以我們?nèi)⊥暌粋€(gè),直接刪除。 returnll.removeFirst(); } publicbooleanhasNext(){ //如果集合不為空,代表有下一個(gè)元素 return!ll.isEmpty(); }}測(cè)試類:/**練習(xí):使用LinkedList模擬棧結(jié)構(gòu)集合(面試題)*分析:* 棧結(jié)構(gòu):先進(jìn)后出**這個(gè)題目說(shuō)的是模擬一個(gè)棧結(jié)構(gòu)的集合,我們應(yīng)該自己定義一個(gè)集合。**/publicclassLinkedListDemo02{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合// LinkedListll=newLinkedList();// //添加元素// ll.addFirst("hello");// ll.addFirst("world");// ll.addFirst("java");// //遍歷集合// for(Objectobj:ll){// System.out.println(obj);// } //創(chuàng)建集合 MyStackms=newMyStack(); //添加元素 ms.add("hello"); ms.add("world"); ms.add("java"); //獲取// System.out.println(ms.get());// System.out.println(ms.get());// System.out.println(ms.get()); //上面代碼重復(fù)太多??紤]用循環(huán) while(ms.hasNext()){ System.out.println(ms.get()); } }}2)ArrayList、Vector、LinkedList的區(qū)別和聯(lián)系 從數(shù)據(jù)結(jié)構(gòu)來(lái)看: ArrayList和Vector都是數(shù)組結(jié)構(gòu),查詢快、增刪慢 LinkedList是鏈接表結(jié)構(gòu),查詢慢、增刪快 從線程安全來(lái)看: ArrayList和LinkedList線程不安全,因此效率高 Vector線程安全,因此效率低Set接口概述1)特點(diǎn) A:不允許重復(fù)元素 B:存取無(wú)序 C:沒有索引2)存儲(chǔ)字符串并遍歷/**演示:用Set存儲(chǔ)字符串并遍歷*/publicclassSetDemo01{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 Sets=newHashSet(); //創(chuàng)建并添加元素 s.add("java"); s.add("hello"); s.add("world"); s.add("java"); s.add("hello"); s.add("world"); //遍歷集合 for(Objectobj:s){ System.out.println(obj); } }}HashSet介紹及特點(diǎn)特點(diǎn): A:存取無(wú)序 B:不允許重復(fù) C:無(wú)索引 D:底層是哈希表哈希表結(jié)構(gòu)HashSet存儲(chǔ)字符串演示/**演示:HashSet存儲(chǔ)字符串并遍歷*/publicclassHashSetDemo01{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 HashSeths=newHashSet(); //創(chuàng)建并添加元素 hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("hello"); hs.add("java"); //遍歷集合 Iteratorit=hs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }}2)哈希表結(jié)構(gòu)圖面試題:哈希表結(jié)構(gòu)如何保證元素唯一? 哈希表保證元素唯一底層依賴兩個(gè)方法:hashCode和equals方法。當(dāng)存儲(chǔ)元素的時(shí)候,首先會(huì)調(diào)用元素的hashCode方法,計(jì)算得出一個(gè)索引值。然后判斷該索引位置是否已經(jīng)有元素。如果沒有元素,直接存儲(chǔ);如果已經(jīng)有了,調(diào)用元素的equals方法,判斷是否是同一個(gè)元素。是相同元素:舍棄;不是同一個(gè),存儲(chǔ)起來(lái)。HashSet存儲(chǔ)自定義對(duì)象原因分析:hashCode默認(rèn)情況是根據(jù)地址值計(jì)算哈希值。這里每個(gè)對(duì)象都是new出來(lái)的,地址肯定不同。那么計(jì)算出的hashCode肯定不同。這樣以來(lái),索引就很大幾率不同。所以就沒有機(jī)會(huì)去對(duì)比是否是同一個(gè)元素了。直接就存儲(chǔ)了。解決方案:重寫hashCode,這里我們最好的辦法是根據(jù)元素的內(nèi)容來(lái)計(jì)算哈希值,盡量達(dá)到讓元素內(nèi)容不同,哈希值就不同,內(nèi)容一樣,哈希值就一樣。但是,發(fā)現(xiàn)問題依舊:hashCode依舊一樣,那么這個(gè)時(shí)候肯定會(huì)調(diào)用元素的equals方法來(lái)比較是否是同一個(gè)元素。而我們沒有重寫equals方法。equals方法默認(rèn)比較的也是地址值。這個(gè)時(shí)候肯定認(rèn)為兩個(gè)柳巖不是同一個(gè)。我們必須重寫equals方法:總結(jié):我們使用HashSet存儲(chǔ)自定義對(duì)象的時(shí)候,請(qǐng)使用快捷鍵生成hashCode和equals方法。Alt+Shift+S再HLinkedHashSet特點(diǎn): A:元素存取有序(鏈接表) B:元素不可以重復(fù)(哈希表)/**演示:LinkedHashMap*/publicclassLinkedHashSetDemo{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 LinkedHashSetlhs=newLinkedHashSet(); //添加元素 lhs.add("hello"); lhs.add("world"); lhs.add("java"); lhs.add("hello"); lhs.add("world"); lhs.add("java"); //遍歷集合 for(Objectobj:lhs){ System.out.println(obj); } }}TreeSet特點(diǎn)特點(diǎn): A:存取無(wú)序 B:元素唯一 C:可以對(duì)元素進(jìn)行排序存儲(chǔ)數(shù)字演示/**演示:TreeSet存儲(chǔ)數(shù)字*/publicclassTreeSetDemo01{ publicstaticvoidmain(String[]args){ //創(chuàng)建集合 TreeSetts=newTreeSet(); //創(chuàng)建并添加元素 ts.add(21); ts.add(30); ts.add(18); ts.add(24); ts.add(16); ts.add(20); ts.add(35); ts.add(18); //遍歷集合 for(Objectobj:ts){ System.out.println(obj); } }}樹結(jié)構(gòu)介紹存儲(chǔ)自定義對(duì)象源碼解析Comparable接口Comparable:可比較的(形容詞)我們發(fā)現(xiàn)String、Integer這些類都實(shí)現(xiàn)了該接口。實(shí)現(xiàn)該接口的類就稱為可比較的類。我們的Student沒實(shí)現(xiàn)該接口,因此不可比較,強(qiáng)制轉(zhuǎn)換的過程中,就會(huì)拋出異常。解決方案:讓我們的Student實(shí)現(xiàn)Comparable接口我們發(fā)現(xiàn):如果年齡一樣,姓名不同,這樣的對(duì)象也被認(rèn)為是同一個(gè)人,結(jié)果沒有保存:原因:我們只比較了年齡,年齡一樣,就認(rèn)為是相同元素。所以才會(huì)把年齡一樣的人給舍棄。解決:這樣不對(duì),我們應(yīng)該在比較年齡時(shí),如果年齡一樣,再比較姓名自定義ComparatorComparator比較器,使用比較器排序TreeSet(Comparatorcomp)構(gòu)造一個(gè)新的空TreeSet,它根據(jù)指定比較器進(jìn)行排序。如果一個(gè)自定義類,實(shí)現(xiàn)了Comparator接口,代表這個(gè)類是一個(gè)比較器類。疑問1:當(dāng)自然排序和比較器排序同時(shí)存在時(shí),優(yōu)先采用比較器排序,為什么?疑問2:比較器中的o1和o2分別是誰(shuí)? o1:新添加的元素 o2:根節(jié)點(diǎn)自定義比較器:publicclassMyComparatorimplementsComparator{ @Override publicintcompare(Objecto1,Objecto2){ //這里返回的如果是正整數(shù)、0、負(fù)整數(shù),代表o1大于、等于、小于o2 Students1=(Student)o1; Students2=(Student)o2; intnum=s1.getAge()-s2.getAge(); intnum2=num==0?s1.getName().compareTo(s2.getName()):num; returnnum2; }}總結(jié)TreeSet存儲(chǔ)自定義對(duì)象,可以對(duì)對(duì)象進(jìn)行排序,排序有兩種方式: 自然排序: 元素本身可比較。元素要實(shí)現(xiàn)Comparable接口,實(shí)現(xiàn)compareTo方法。 publicintcompareTo(Objectobj){ //this:新添加的元素 //obj:根節(jié)點(diǎn)元素} 比較器排序: 元素本身可能無(wú)法比較,因此我們自定義類,實(shí)現(xiàn)Comparator接口,這個(gè)類就成為比較器類。 然后我們要實(shí)現(xiàn)compare方法 publicintcompare(Objecto1,Objecto2){ //o1:新添加的元素 //o2:根節(jié)點(diǎn)元素} 我們?cè)趧?chuàng)建TreeSet的時(shí)候,必須把比較器類的對(duì)象作為參數(shù)傳遞給TreeSet。 默認(rèn)情況下,比較器優(yōu)先于自然排序 我們最常用的是匿名內(nèi)部類的比較器排序。Collection體系總結(jié)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生死狀挑戰(zhàn)協(xié)議書
- 苗木回收協(xié)議書
- 蘋果受災(zāi)協(xié)議書
- 蔬菜配送協(xié)議書
- 認(rèn)養(yǎng)牛合同范本
- 認(rèn)購(gòu)轉(zhuǎn)讓協(xié)議書
- 設(shè)計(jì)制作協(xié)議書
- 試用工合同范本
- 請(qǐng)求生產(chǎn)協(xié)議書
- 廢物出售協(xié)議書
- 中國(guó)昭通中藥材國(guó)際中心項(xiàng)目可行性研究報(bào)告
- 2025中國(guó)融通資產(chǎn)管理集團(tuán)有限公司招聘筆試備考試題(230人)附答案解析
- 2026馬年春節(jié)新年年貨節(jié)大集廟會(huì)(金馬迎春年貨大集)活動(dòng)策劃方案
- 心臟搭橋課件
- 2026年安全員之A證考試題庫(kù)500道附答案【滿分必刷】
- 2025年廣東省第一次普通高中學(xué)業(yè)水平合格性考試(春季高考)思想政治試題(含答案詳解)
- 人工智能行業(yè)-“人工智能+”行動(dòng)深度解讀與產(chǎn)業(yè)發(fā)展機(jī)遇
- 養(yǎng)殖場(chǎng)貸款申請(qǐng)書樣本
- (一診)達(dá)州市2026屆高三第一次診斷性測(cè)試思想政治試題(含標(biāo)準(zhǔn)答案)
- 購(gòu)車意向金合同范本
- 學(xué)堂在線醫(yī)學(xué)英語(yǔ)詞匯進(jìn)階(首醫(yī))作業(yè)單元測(cè)驗(yàn)答案
評(píng)論
0/150
提交評(píng)論