若是一個程序只包含固定數量的且其生命週期都是已知的對象,那麼這是一個很是簡單的程序。一般,程序老是根據運行時才知道的某些條件去建立新對象。在此以前,不會知道你所須要對象的數量,甚至不知道確切的類型。爲了解決這個廣泛的編程問題,須要在任意時刻和任意位置建立任意數量的對象。因此,就不能依靠建立命名的引用來持有每個對象,由於你不知道實際上會須要多少這樣的引用java
——Thinking in Java面試
咱們來簡單的解釋一下:編程
首先要知道咱們所學習的Java語言是一個徹底面向對象的語言,而這種語言對事物的描述是經過對象體現的,爲了方便對多個對象進行操做,咱們就必須把這多個對象進行存儲。數組
一個基本類型的變量顯然是沒法知足存儲多個對象的,因此應該是一個容器類型的變量,經過前面的知識,咱們知道數組和StringBuffe、StringBuilder均屬於容器類型。可是呢? StringBuffer的結果是一個字符串,不必定知足咱們的要求,因此咱們只能選擇數組,這就是對象數組。數據結構
但是問題又來了,對象數組又不能適應變化的需求,由於數組的長度是固定的,這個時候,爲了適應變化的需求,Java就提供了集合類供咱們使用。框架
A:長度區別學習
數組的長度固定ui
集合長度可變spa
B:內容不一樣code
數組存儲的是同一種類型的元素
而集合能夠存儲不一樣類型的元素
C:元素的數據類型問題
數組能夠存儲基本數據類型,也能夠存儲引用數據類型
集合只能存儲引用類型(裝對象)
雖然數組看起來有一絲不太靈活,但數組也確實是保存一組對象的有效方法,若是想要保存一組基本數據類型,咱們也推薦使用這種方法,只是因爲其長度固定,致使它在不少時候也受到一些限制。
補充:
在Java中,數組是一種效率最高的存儲和隨機訪問對象的引用序列的方式。數組就是一個簡單的線性序列,這使得元素訪問很是快速。可是爲這種速度所付出的代價是數組對象的大小被固定,而且在其生命週期中不可改變。你可能會建議使用ArrayList,它能夠經過建立一個新實例,而後把舊實例中全部的引用到移到新實例中,從而實現更多空間的自動分配。儘管一般應該首選ArrayList而不是數組、可是這種彈性須要開銷,所以,ArrayList的效率比數組低不少。——Thinking in Java 第16章
Java提供了不少種集合類,他們的數據結構是不一樣的,可是,它們確定有一些共性的地方 (存儲,獲取,判斷)一直向上追溯,咱們能夠的獲得這樣繼承體系
Collection : 是集合的頂層接口,它的子體系有重複的,有惟一的,有有序的,有無序的。
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:獲取功能(重點)
Iterator<E> iterator()
5:長度功能
int size()
面試題:數組有沒有length()方法呢?字符串有沒有length()方法呢?集合有沒有length()方法呢?
數組求長度用length屬性 字符串求長度用length()方法 集合求長度用size()方法
6:交集功能
//兩個集合A B ,A對B交集,最終的結果保存在A 中,B不變。返回值表示的是A是否發生過改變 boolean retainAll(Collection c)
7:把集合轉換爲數組
Object[] toArray()
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()); //上述代碼實現不了是由於,Object中沒有length()方法 //咱們想要使用字符串的方法,就必須把元素還原成字符串 //向下轉型 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) { //建立集合對象 Collection c = new ArrayList(); //建立學生對象 Student s1 = new Student("admin", 10); Student s2 = new Student("張三", 20); Student s3 = new Student("李四", 30); Student s4 = new Student("王五", 40); //把學生添加到集合 c.add(s1); c.add(s2); c.add(s3); c.add(s4); //把集合轉化爲數組 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()); //上述代碼實現不了是由於,Object中沒有length()方法 //咱們想要使用字符串的方法,就必須把元素還原成字符串 //向下轉型 Student s = (Student) objs[x]; System.out.println(s.getName() + "-" + s.getAge()); } } }
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) { //建立集合對象 Collection c = new ArrayList(); c.add("I"); c.add("love"); c.add("you"); c.add("!"); //實際返回的確定是子類對象,這裏是多態 Iterator it = c.iterator(); while (it.hasNext()) { String s = (String) it.next(); System.out.println(s); } } } //運行結果 I love you !
(1) 經過集合對象獲取迭代器對象 —— Iterator it = c.iterator();
(2) 經過迭代器對象的hasNext()方法判斷是否有元素 ——while
經過迭代器對象的next()方法獲取元素而且移動到下一個位置
迭代器爲何不定義成一個類,而是一個接口?
假設迭代器定義的是一個類,這樣咱們就能夠建立該類的對象,調用該類的方法來實現集合的遍歷。可是呢?咱們想一想,Java中提供了不少的集合類,而這些集合類的數據結構是不一樣的,因此存儲的方式和遍歷的方式應該是不一樣的。進而它們的遍歷方式也應該是不一樣的,最終就沒有定義迭代器類。
而不管你是哪一種集合,你都應該具有獲取元素的操做,而且,最好再輔助於判斷功能,這樣在獲取前,先判斷,這樣就更不容易出錯。也就是說,判斷功能和獲取功能應該是一個集合遍歷所具有的,而每種集合的方式又不太同樣,因此咱們把這兩個功能給提取出來,並不提供具體實現,這種方式就是接口。
那麼,真正的具體實現類在哪裏呢?
在真正的具體的子類中,之內部類的方式體現。
若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^
若是能幫到你的話,那就來關注我吧!(系列文章均會在公衆號第一時間更新)
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤一個堅持推送原創Java技術的公衆號:理想二旬不止