20、JAVA进阶——集合(1)
?作者簡介:熱愛國學的Java后端開發者,修心和技術同步精進。
🍎個人主頁:樂趣國學的博客
🍊個人信條:不遷怒,不貳過。小知識,大智慧。
💞當前專欄:JAVA開發者成長之路
?特色專欄:國學周更-心性養成之路
🥭本文內容:JAVA進階——集合(1)
更多內容點擊👇
? ? ? ? ? ? ? ? ? ? ? ?JAVA入門——異常
???????????????????????JAVA入門——接口
目錄
一、認識集合
二、List接口?
1、 使用ArrayList類動態存儲數據
2、 使用LinkedList類動態存儲數據
三、Set接口?
1、 Set接口概述
2、 使用HashSet類動態存儲數據
四、Iterator接口
1、 Iterator接口概述
2、 使用Iterator遍歷集合
五、Map接口
1、 Map接口概述
2、使用HashMap類動態存儲數據
一、認識集合
????????(1)開發應用程序時,如果想存儲多個同類型的數據,可以使用數組來實現;但是使用數組存在如下一些明顯缺陷:
????????????????-->數組長度固定,不能很好地適應元素數量動態變化的情況。
????????????????-->可通過數組名.length獲取數組的長度,卻無法直接獲取數組中實際存儲的元素個數。
????????????????-->數組采用在內存中分配連續空間的存儲方式存儲,根據元素信息查找時效率比較低,需要多次比較。
????????(2)從以上分析可以看出數組在處理一些問題時存在明顯的缺陷,針對數組的缺陷,Java提供了比數組更靈活、更實用的集合框架,可大大提高軟件的開發效率,并且不同的集合可適用于不同應用場合。
????????(3)Java集合框架提供了一套性能優良、使用方便的接口和類,它們都位于java.util包中,其主要內容及彼此之間的關系如下圖所示。
????????(4)從上圖可以看出,Java的集合類主要由Map接口和Collection接口派生而來,其中Collection接口有兩個常用的子接口,即List接口和Set接口,所以通常說Java集合框架由3大類接口組成(Map接口、List接口和Set接口)。
二、List接口?
????????~??Collection接口是最基本的集合接口,可以存儲一組不唯一、無序的對象。
????????~??List接口繼承自Collection接口,是有序集合。用戶可以使用索引(下標)訪問List接口中的元素,類似于數組。
????????~??List接口中允許存放重復元素,也就是說List可以存放一組不唯一、有序的對象。
????????~??List接口常用的實現類有ArrayList和LinkedList。
1、 使用ArrayList類動態存儲數據
????????(1)針對數組的一些缺陷,Java集合框架提供了ArrayList集合類,對數組進行了封裝,實現了長度可變的數組,而且和數組采用相同的存儲方式,在內存中分配連續的空間,如下圖所示,所以,經常說ArrayList為動態數組。
????????但是它不等同于數組,ArrayList集合中可以添加任何類型的數據,并且添加的數據都將轉換成Object類型,而在數組中只能添加同一類型的數據。
//創建3個NewsTitle類對象NewsTitle nt1 = new NewsTitle(1001, "新聞一", "作者1");NewsTitle nt2 = new NewsTitle(1002, "新聞二", "作者2");NewsTitle nt3 = new NewsTitle(1003, "新聞三", "作者3");//數據準備好了,接下來要準備一個集合容器,使用ArrayListArrayList al = new ArrayList();????????(2)ArrayList類提供了很多方法用于操作數據,下表列出的是ArrayList類的常用方法。
?各方法具體用法代碼展示:
//將數據存儲到集合中,使用ArrayList類中的add()方法將數據存儲到集合中al.add(nt1);al.add(nt2);al.add(nt3);al.add(nt2);//講數據存儲到集合中的指定位置:add(int index,Object obj)al.add(2, nt1);//接下來對集合中元素的操作,都是通過集合對象名al調用方法來實現//1)獲取集合中的元素個數:size()int size =al.size();System.out.println("al集合中元素個數:"+size);//2)獲取集合中某個指定下標的元素:get(int index)//獲取集合中的第一個元素/** 在NewsTitle類沒有重寫toString()方法的時候,通過al.get()方法獲取集合中元素,直接輸出這個元素,得到的是一個地址值* 因為直接輸出對象和通過對象調用toString(),這個toString()是Object類中的toString()方法,輸出的都是地址值* 輸出地址沒有任何意義,所以會在NewsTitle類中重寫toString()方法* * 因為在NewsTitle類中重寫了toString()方法,通過al.get()方法獲取集合中的元素,雖然得到的類型是Object類型* 但是在輸出對象的時候,調用的是NewsTitle類重寫后的toString();*/Object obj1 =al.get(0);//System.out.println(obj1);NewsTitle nt = (NewsTitle)obj1;System.out.println(nt);System.out.println("---------------------------");//3)遍歷集合中的元素for(int i =0;i<al.size();i++){Object object=al.get(i);NewsTitle newsTitle = (NewsTitle)object;System.out.println(newsTitle);}//4)判斷集合中是否包含某一個元素:contains()boolean result1 = al.contains(nt3);System.out.println("集合中包含nt3這個元素:"+result1);//5)刪除集合中的元素:remove(元素名)/remove(元素下標)boolean result2 =al.remove(nt3);System.out.println("元素刪除成功:"+result2);System.out.println("****************************************");//刪除后使用增強for循環遍歷集合for(Object object:al){NewsTitle newsTitle = (NewsTitle)object;System.out.println(newsTitle);}System.out.println("****************************************");Object obj=al.remove(1);System.out.println(obj);System.out.println("****************************************");//刪除元素后使用迭代器遍歷集合:iterator()/** Iterator:迭代器,可以將它看成是集合容器* 將集合al中得元素轉移到了Iterator中* 接下來使用hasNext()方法判斷Iterator容器中是否有元素,如果有返回true,那么就調用next()方法取出集合中的元素* 如果hasNext()方法返回false,說明Iterator容器中沒喲元素* * */Iterator it =al.iterator();//從it容器中取出元素while(it.hasNext()){Object object =it.next();NewsTitle ntt = (NewsTitle)object;System.out.println(ntt);}//判斷集合是否為空:isEmpty()boolean result3 =al.isEmpty();System.out.println("集合為空:"+result3);System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");//將集合中的元素轉換為數組:toArray()Object[] objs=al.toArray();for (int i = 0; i < objs.length; i++) {System.out.println(objs[i]);}//清空集合:clear()al.clear();System.out.println(al.size());System.out.println(al.isEmpty());?????????(3)ArrayList集合因為可以使用索引來直接獲取元素,所以其優點是遍歷元素和隨機訪問元素的效率比較高。但是由于ArrayList集合采用了和數組相同的存儲方式,在內存中分配連續的空間,因此在添加和刪除非尾部元素時會導致后面所有元素的移動,這就造成在插入元素、刪除元素等操作頻繁的應用場景下使用ArrayList會導致性能低下。所以數據操作頻繁時,最好使用LinkedList存儲數據。
2、 使用LinkedList類動態存儲數據
????????(1)LinkedList類是List接口的鏈接列表實現類。它支持實現所有List接口可選的的列表的操作,并且允許元素值是任何數據,包括null。
????????(2)LinkedList類采用鏈表存儲方式存儲數據,如下圖所示,優點在于插入、刪除元素時效率比較高,但是LinkedList類的查找效率很低。
????????(3)它除了包含ArrayList類所包含的方法之外,還提供了下表所示的一些方法,可以在LinkedList類的首部或尾部進行插入、刪除操作。
//獲取集合中的第一個元素Object obj2=linkList.getFirst();NewsTitle ntt2 = (NewsTitle)obj2;System.out.println(ntt2);//獲取集合中的最后一個元素Object obj3=linkList.getLast();NewsTitle ntt3 = (NewsTitle)obj3;System.out.println(ntt3);//刪除集合中的第一個元素和最后一個元素System.out.println("刪除的第一個元素是:"+linkList.removeFirst());System.out.println("刪除的最后一個元素是:"+linkList.removeLast());System.out.println("集合為空:"+linkList.isEmpty());linkList.clear();System.out.println("集合為空:"+linkList.isEmpty());????????(4)除了LinkedList類中特有的方法外,LinkedList類和ArrayList類所包含的大部分方法是完全一樣的,這主要是因為它們都是List接口的實現類。由于ArrayList采用和數組一樣的連續的順序存儲方式,當對數據頻繁檢索時效率較高,而LinkedList類采用鏈表存儲方式,當對數據添加、刪除或修改比較多時,建議選擇LinkedList類存儲數據。
三、Set接口?
1、 Set接口概述
????????(1)Set接口是Collection接口的另外一個常用子接口,Set接口描述的是一種比較簡單的集合。
????????(2)集合中的對象并不按特定的方式排序,并且不能保存重復的對象,也就是說Set接口可以存儲一組唯一、無序的對象。
????????(3)Set接口常用的實現類有HashSet。
2、 使用HashSet類動態存儲數據
????????(1)HashSet集合的特點如下:
????????????????-->集合內的元素是無序排列的。
????????????????-->HashSet類是非線程安全的。
????????????????-->允許集合元素值為null。
????????(2)HashSet類的常用方法如下所示:
????????(3)List接口可以使用for循環、增強for循環、迭代器(Iterator接口)三種方式遍歷。使用for循環遍歷時,通過get()方法取出每個對象,但HashSet類不存在get()方法,所以Set接口無法使用普通for循環遍歷。
????????(4)Set接口可以使用增強for循環、迭代器(Iterator接口)兩種方式遍歷。
?????????代碼展示:
package cn.bdqn.demo03;import java.util.HashSet; import java.util.Iterator;import cn.bdqn.demo02.NewsTitle;public class HashSetDemo01 {public static void main(String[] args) {// 創建3個NewsTitle類對象NewsTitle nt1 = new NewsTitle(1001, "新聞1","作者1");NewsTitle nt2 = new NewsTitle(1002, "新聞2","作者2");NewsTitle nt3 = new NewsTitle(1003, "新聞3","作者3");// 數據準備好了,接下來要準備一個集合容器,使用HashSet hs = new HashSet();//將元素存儲到集合中hs.add(nt1);hs.add(nt2);hs.add(nt3);hs.add(nt2);//獲取集合中元素個數int size = hs.size();System.out.println("集合元素個數:"+size);//獲取集合中的元素,Set集合是無序的,所以里面沒有get(下標)方法獲取元素for(Object object:hs){NewsTitle newsTitle = (NewsTitle)object;System.out.println(newsTitle);}System.out.println("--------------------使用迭代器遍歷集合----------------");//可以通過迭代器來遍歷元素Iterator it =hs.iterator();while(it.hasNext()){Object object = it.next();NewsTitle newsTitle = (NewsTitle)object;System.out.println(newsTitle);}}}四、Iterator接口
1、 Iterator接口概述
????????(1)Iterator接口表示對集合進行迭代的迭代器。Iterator接口為集合而生,專門實現集合的遍歷。
????????(2)凡是由于Collection接口派生而來的接口或者類,都實現了iterator()方法,iterator()方法返回一個Iterator對象。
????????(3)Iterator接口主要有如下兩個方法:
????????????????-->hasNext():判斷是否存在在一個可訪問的元素,如果仍有元素可以迭代,則返回true。
????????????????-->next():返回要訪問的下一個元素。
2、 使用Iterator遍歷集合
Iterator it = list.iterator(); //獲取集合迭代器Iteratorwhile(it.hashNext()){ //通過迭代器依次輸出集合中所有元素的信息Object obj = it.next();}五、Map接口
1、 Map接口概述
(1)Map接口存儲一組成對的鍵(key)——值(value)對象,提供key到value的映射,通過key來檢索。
(2)Map接口中的key不要求有序,不允許重復。value同樣不要求有序,但允許重復。
(3)Map接口的常用方法如下:
2、使用HashMap類動態存儲數據
(1)Map接口中存儲的數據都是鍵——值對,最常用的Map的實現類是HashMap,其優點是查詢元素效率高。
(2)遍歷HashMap集合時可以遍歷鍵集和值集,有for循環遍歷、增強for循環遍歷和迭代器(Iterator接口)遍歷三種方式。
? ? ? ? 代碼展示:
package cn.bdqn.demo04;import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Set;public class HashMapDemo01 {public static void main(String[] args) {//準備HashMap容器HashMap hm = new HashMap();//使用put()方法將一個人的英文名和中文名存儲到集合中hm.put("Jack", "張三");hm.put("Dave", "李四");hm.put("Lucy", "露絲");hm.put("Lily", "麗麗");hm.put("Jony", "吉莉");//獲取集合中元素個數int size = hm.size();System.out.println("集合元素個數:"+size);//通過鍵獲取鍵對應的值Object object =hm.get("Lily");String value1 = (String)object;System.out.println("Lily對應的中文名:"+value1);//通過鍵來刪除鍵值對Object object2 =hm.remove("Lily");String value2 = (String)object2;System.out.println("你刪除的Lily對應的值是:"+value2);System.out.println(hm.size());//判斷集合中是否包含指定的鍵/值System.out.println(hm.containsKey("Dave"));System.out.println(hm.containsKey("Lily"));System.out.println(hm.containsValue("麗麗"));System.out.println("--------------------");//獲取集合中所有的鍵Set keys=hm.keySet();for (Object obj :keys) {String key = (String)obj;System.out.println(key);}System.out.println("--------------------");//獲取值的集合Collection values =hm.values();Iterator it =values.iterator();while(it.hasNext()){Object obj2 =it.next();String value = (String)obj2;System.out.println(value);}}}(3)map集合的第3種遍歷方式:map.entrySet()方法
//map集合的第3種遍歷方式Set keyValues=map.entrySet();for(Object obje:keyValues){Map.Entry me =(Map.Entry)obje;//獲取鍵Object ob1 = me.getKey();String key = (String)ob1;//獲取值Object ob2 =me.getValue();Student student = (Student)ob2;System.out.println(key+"對應的學生:"+student);}????????碼文不易,本篇文章就介紹到這里,如果想要學習更多Java系列知識,請關注博主,博主帶你零基礎學習Java知識。與此同時,對于日常生活有困擾的朋友,歡迎閱讀我的第四欄目:《國學周更—心性養成之路》,學習技術的同時,我們也注重了心性的養成。
總結
以上是生活随笔為你收集整理的20、JAVA进阶——集合(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快讯 欧洲ICO远超中美
- 下一篇: js获取本周日期和上周日期