摘要:第三階段常見對象的學(xué)習(xí)集合框架概述和集合的遍歷一集合框架的概述集合的由來如果一個程序只包含固定數(shù)量的且其生命周期都是已知的對象,那么這是一個非常簡單的程序。進(jìn)而它們的遍歷方式也應(yīng)該是不同的,最終就沒有定義迭代器類。
第三階段 JAVA常見對象的學(xué)習(xí) 集合框架概述和集合的遍歷 (一) 集合框架的概述 (1) 集合的由來
如果一個程序只包含固定數(shù)量的且其生命周期都是已知的對象,那么這是一個非常簡單的程序。通常,程序總是根據(jù)運行時才知道的某些條件去創(chuàng)建新對象。在此之前,不會知道你所需要對象的數(shù)量,甚至不知道確切的類型。為了解決這個普遍的編程問題,需要在任意時刻和任意位置創(chuàng)建任意數(shù)量的對象。所以,就不能依靠創(chuàng)建命名的引用來持有每一個對象,因為你不知道實際上會需要多少這樣的引用
? ——Thinking in Java
我們來簡單的解釋一下:
首先要知道我們所學(xué)習(xí)的Java語言是一個完全面向?qū)ο?/strong>的語言,而這種語言對事物的描述是通過對象體現(xiàn)的,為了方便對多個對象進(jìn)行操作,我們就必須把這多個對象進(jìn)行存儲。
一個基本類型的變量顯然是無法滿足存儲多個對象的,所以應(yīng)該是一個容器類型的變量,通過前面的知識,我們知道數(shù)組和StringBuffe、StringBuilder均屬于容器類型。但是呢? StringBuffer的結(jié)果是一個字符串,不一定滿足我們的要求,所以我們只能選擇數(shù)組,這就是對象數(shù)組。
可是問題又來了,對象數(shù)組又不能適應(yīng)變化的需求,因為數(shù)組的長度是固定的,這個時候,為了適應(yīng)變化的需求,Java就提供了集合類供我們使用。
(2) 數(shù)組和集合的區(qū)別?A:長度區(qū)別
數(shù)組的長度固定
集合長度可變
B:內(nèi)容不同
數(shù)組存儲的是同一種類型的元素
而集合可以存儲不同類型的元素
C:元素的數(shù)據(jù)類型問題
數(shù)組可以存儲基本數(shù)據(jù)類型,也可以存儲引用數(shù)據(jù)類型
集合只能存儲引用類型(裝對象)
雖然數(shù)組看起來有一絲不太靈活,但數(shù)組也確實是保存一組對象的有效方法,如果想要保存一組基本數(shù)據(jù)類型,我們也推薦使用這種方法,只是由于其長度固定,導(dǎo)致它在很多時候也受到一些限制。
補(bǔ)充:
在Java中,數(shù)組是一種效率最高的存儲和隨機(jī)訪問對象的引用序列的方式。數(shù)組就是一個簡單的線性序列,這使得元素訪問非常快速。但是為這種速度所付出的代價是數(shù)組對象的大小被固定,并且在其生命周期中不可改變。你可能會建議使用ArrayList,它可以通過創(chuàng)建一個新實例,然后把舊實例中所有的引用到移到新實例中,從而實現(xiàn)更多空間的自動分配。盡管通常應(yīng)該首選ArrayList而不是數(shù)組、但是這種彈性需要開銷,因此,ArrayList的效率比數(shù)組低很多。(3) 集合框架關(guān)系,以及Collection 類簡介——Thinking in Java 第16章
Java提供了很多種集合類,他們的數(shù)據(jù)結(jié)構(gòu)是不同的,但是,它們肯定有一些共性的地方 (存儲,獲取,判斷)一直向上追溯,我們可以的得到這樣繼承體系
Collection : 是集合的頂層接口,它的子體系有重復(fù)的,有唯一的,有有序的,有無序的。
Collection c = new Collection(); //這是錯誤的 接口不能實例化
Collection的功能概述:
1:添加功能
//添加一個元素 Boolean add(Object obj) //添加一個集合的元素 Boolean addAll(Collection c)
2:刪除功能
//移除所有元素 void clear() //移除一個元素 boolean remove(Object o) //移除一個集合的元素(有一個移除就返回true) Boolean removeAll(Collection c)
3:判斷功能
//判斷集合中是否包含指定的元素 Boolean contains(Object o) //判斷集合中是否包含指定的集合元素(包含所有) Boolean containsAll(Collection c) //判斷集合是否為空 Boolean isEmpty()
4:獲取功能(重點)
Iteratoriterator()
5:長度功能
int size()
面試題:數(shù)組有沒有l(wèi)ength()方法呢?字符串有沒有l(wèi)ength()方法呢?集合有沒有l(wèi)ength()方法呢?
數(shù)組求長度用length屬性 字符串求長度用length()方法 集合求長度用size()方法
6:交集功能
//兩個集合A B ,A對B交集,最終的結(jié)果保存在A 中,B不變。返回值表示的是A是否發(fā)生過改變 boolean retainAll(Collection c)
7:把集合轉(zhuǎn)換為數(shù)組
Object[] toArray()(二) 集合的遍歷 (1) 集合轉(zhuǎn)數(shù)組遍歷
import java.util.ArrayList; import java.util.Collection; public class Demo { public static void main(String[] args) { Collection c = new ArrayList(); c.add("I"); c.add("love"); c.add("you"); c.add("!"); Object[] objs = c.toArray(); for (int x = 0; x < objs.length; x++) { //System.out.println(objs[x]); //得到的元素是字符串,我在獲取到元素的同時,如果還想知道元素的長度 //System.out.println(objs[x] + "---" + objs[x].length()); //上述代碼實現(xiàn)不了是因為,Object中沒有l(wèi)ength()方法 //我們想要使用字符串的方法,就必須把元素還原成字符串 //向下轉(zhuǎn)型 String s = (String) objs[x]; System.out.println(s + "---" + s.length()); } } }
/* * Collection存儲自定義對象并遍歷案例 */ import java.util.ArrayList; import java.util.Collection; public class StudentDemo { public static void main(String[] args) { //創(chuàng)建集合對象 Collection c = new ArrayList(); //創(chuàng)建學(xué)生對象 Student s1 = new Student("admin", 10); Student s2 = new Student("張三", 20); Student s3 = new Student("李四", 30); Student s4 = new Student("王五", 40); //把學(xué)生添加到集合 c.add(s1); c.add(s2); c.add(s3); c.add(s4); //把集合轉(zhuǎn)化為數(shù)組 Object[] objs = c.toArray(); //遍歷數(shù)組 for (int x = 0; x < objs.length; x++) { //System.out.println(objs[x]); //得到的元素是字符串,我在獲取到元素的同時,如果還想知道元素的長度 //System.out.println(objs[x] + "---" + objs[x].length()); //上述代碼實現(xiàn)不了是因為,Object中沒有l(wèi)ength()方法 //我們想要使用字符串的方法,就必須把元素還原成字符串 //向下轉(zhuǎn)型 Student s = (Student) objs[x]; System.out.println(s.getName() + "-" + s.getAge()); } } }(2) 集合迭代器遍歷
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* * Iterator iterator() 迭代器,集合的專用遍歷方式 * Object next():獲取元素 * oolean hasNext():如果仍有元素可以迭代,則返回 true。 */ public class IteratorDemo { public static void main(String[] args) { //創(chuàng)建集合對象 Collection c = new ArrayList(); c.add("I"); c.add("love"); c.add("you"); c.add("!"); //實際返回的肯定是子類對象,這里是多態(tài) Iterator it = c.iterator(); while (it.hasNext()) { String s = (String) it.next(); System.out.println(s); } } } //運行結(jié)果 I love you !
創(chuàng)建集合元素
創(chuàng)建元素對象
把元素添加到集合
遍歷集合
(1) 通過集合對象獲取迭代器對象 —— Iterator it = c.iterator();
(2) 通過迭代器對象的hasNext()方法判斷是否有元素 ——while
通過迭代器對象的next()方法獲取元素并且移動到下一個位置
迭代器為什么不定義成一個類,而是一個接口?
假設(shè)迭代器定義的是一個類,這樣我們就可以創(chuàng)建該類的對象,調(diào)用該類的方法來實現(xiàn)集合的遍歷。但是呢?我們想想,Java中提供了很多的集合類,而這些集合類的數(shù)據(jù)結(jié)構(gòu)是不同的,所以存儲的方式和遍歷的方式應(yīng)該是不同的。進(jìn)而它們的遍歷方式也應(yīng)該是不同的,最終就沒有定義迭代器類。
而無論你是哪種集合,你都應(yīng)該具備獲取元素的操作,并且,最好再輔助于判斷功能,這樣在獲取前,先判斷,這樣就更不容易出錯。也就是說,判斷功能和獲取功能應(yīng)該是一個集合遍歷所具備的,而每種集合的方式又不太一樣,所以我們把這兩個功能給提取出來,并不提供具體實現(xiàn),這種方式就是接口。
那么,真正的具體實現(xiàn)類在哪里呢?
在真正的具體的子類中,以內(nèi)部類的方式體現(xiàn)。
結(jié)尾:如果內(nèi)容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關(guān)注我吧!(系列文章均會在公眾號第一時間更新)
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創(chuàng)Java技術(shù)的公眾號:理想二旬不止
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77871.html
摘要:第三階段常見對象的學(xué)習(xí)集合框架集合在實際需求中,我們常常會遇到這樣的問題,在諸多的數(shù)據(jù)中,通過其編號來尋找某一些信息,從而進(jìn)行查看或者修改,例如通過學(xué)號查詢學(xué)生信息。面試題和的區(qū)別是單列集合的頂層接口,有子接口和。 第三階段 JAVA常見對象的學(xué)習(xí) 集合框架——Map集合 showImg(https://segmentfault.com/img/remote/1460000019683...
摘要:第三階段常見對象的學(xué)習(xí)集合框架接口按照集合框架的繼承體系,我們先從中的接口開始學(xué)習(xí)一概述及功能演示概述在中充當(dāng)著一個什么樣的身份呢有序的也稱為序列實現(xiàn)這個接口的用戶以對列表中每個元素的插入位置進(jìn)行精確地控制。線程不安全,效率高。 第三階段 JAVA常見對象的學(xué)習(xí) 集合框架——List接口 showImg(https://segmentfault.com/img/remote/14600...
摘要:使用默認(rèn)隨機(jī)源對指定列表進(jìn)行置換。將集合排序使用二分搜索法搜索指定列表,以獲得指定對象根據(jù)元素的自然順序,返回給定的最大元素。 1_Map集合概述和特點 A:Map接口概述 查看API可以知道: 將鍵映射到值的對象 一個映射不能包含重復(fù)的鍵 每個鍵最多只能映射到一個值 B:Map接口和Collection接口的不同 Map是雙列的,Collection是單列的 Map...
摘要:接口也是集合中的一員,但它與接口有所不同,接口與接口主要用于存儲元素,而主要用于迭代訪問即遍歷中的元素,因此對象也被稱為迭代器。迭代器的實現(xiàn)原理我們在之前案例已經(jīng)完成了遍歷集合的整個過程。 【Collection、泛型】 主要內(nèi)容 Collection集合 迭代器 增強(qiáng)for 泛型 教學(xué)目標(biāo) [ ] 能夠說出集合與數(shù)組的區(qū)別 [ ] 說出Collection集合的常用功能 [ ]...
1_(去除ArrayList中重復(fù)字符串元素方式)* A:案例演示 需求:ArrayList去除集合中字符串的重復(fù)值(字符串的內(nèi)容相同) 思路:創(chuàng)建新集合方式 import java.util.ArrayList; import java.util.Iterator; public class ArrayList_1_demo { /* 創(chuàng)建新集合將重復(fù)元素去掉 * 1.明...
閱讀 3762·2021-09-22 15:17
閱讀 1945·2021-09-22 14:59
閱讀 2346·2020-12-03 17:00
閱讀 3208·2019-08-30 15:55
閱讀 482·2019-08-30 11:23
閱讀 3487·2019-08-29 13:56
閱讀 518·2019-08-29 12:54
閱讀 2257·2019-08-29 12:49