Java集合基礎
Java集合框架的由來
在java1.2之前,java沒有完整的集合框架。它只有一些簡單的可以擴展的容器類,比如Victor,Stack,Hashtable等
為什麽需要容器類:容器(集合類)可以存儲多個數據。
數組的弊端:
1.長度是不可變的,一旦數組初始化之後,長度是固定的
2.在N個地方需要存儲多個數據,都得專門去編寫數組的操作方法。
什麽是集合框架
盡管這些容器類非常好用,但是卻不能集中和統一管理。集合框架是為表示和操作集合而規定的統一的標準的體系結構。任何集合框架都包含三大塊內容:對外的接口、接口的實現和對集合運算的算法。
為什麽需要集合(集合框架的類和接口都放在java.util包中)
1.提供功能的復用
2.讓程序員專註業務開發,而不是數據結構和算法
常用的集合:
集合中存儲的對象,稱之為集合的元素。
Set:集合中的對象不按特定的方式排序,不允許元素重復
List:集合中的對象按照索引位置排序,允許重復
Map:集合中的每一個元素都包含一堆key和value對象,不允許key對象重復,值是可以重復
鏈表結構
1.單向鏈表:只能從頭遍歷到尾巴 或者只能從尾巴遍歷到頭
2.雙向鏈表:既可以從頭到尾也可以從尾遍歷到頭
通過引用關系來表示上一個節點和下一個節點的關系
二.集合的叠代操作
1.for循環
2.For-each
3.Iterrator步驟
a.調用iterator() 方法 b.調用hasNext()方法 c.調用next()方法
三.Set接口
1.Set接口存儲一組唯一的、無序的對象
2.不會記錄元素的添加先後順序
3.HashSet是Set接口常用的實現類
HashSet如何判斷兩個對象是否相同
1.兩個對象的equals比較相等,返回true,說明是相同對象
2.兩個對象的hashCode方法返回值相等
比較過程:當往HashSet集合中添加新的對象的時候,先會判斷該對象和集合對象中的hashCode值
1)不等:直接把該新的對象存儲到hashCode指定的位置
2)相等:再繼續判斷新對象和集合對象中equals作比較
a) hashCode相同,equals相同true:則視為是同一個對象,則不保存在哈希表中
b) hashCode相同,equals不同false
Set接口如何判斷加入對象時候已經存在?
采用對象的equals()方法比較兩個對象時候相等
四.Map接口
映射的數學解釋:
設A/B兩個非空集合,如果存在一個法則f,使得A中的每個元素,按照法則f,在B中有唯一的確定的元素b與之對應,則稱為從A到B的映射。
映射關系(兩個集合):A集合和B集合>>>>A集合中的每一個元素都可以在B集合中找到唯一的一個字與之對應。
嚴格上來說,Map是集合不太恰當,應該是兩個集合之間的映射關系,然而Map可以存儲數據(每次存儲都應該存儲A集合中一個元素(Key),B集合中的一個元素(value)),我們習慣吧Map也稱之為集合。
問題:建立國家英文簡稱和中文全民之間的鍵值映射
遍歷Map集合:叠代器 增強for循環
常用方法: put(k,v) get(k) remove(k) size() keySet()--返回Set
五.泛型
為什麽要使用泛型:
1.存儲任意類型的數據在集合中,但是取出來的時候都是Object類型,此時就得強制類型轉換
2.可以約束存儲到集合中的元素必須是相同的數據類型(相同的數據類型才能作比較)
3.設計 一個 Point 類,來表示坐標位置,要求坐標位置支持String 、Integer、Double類型
什麽是泛型:將對象的類型作為參數,指定到其他類或者方法上,從而保證類型轉換的安全性和穩定
1.廣泛通用的類型
2.代碼模板中類型不確定,誰調用該代碼,誰指明類型是什麽
泛型類:直接在類/接口上定義的泛型
使用泛型:
保證前後類型相同
List<String> list=new ArrayList<String>() // 該集合只能存儲String類型
因為前後類型相同,所以從java7開始,推出了泛型的菱形語法<>
List<String> list=new ArrayList<>();
泛型不存在繼承關系:List<Object> list=new ArrayList<String>() >>>>>錯誤的語法
以後,使用集合都得用泛型來約束該集合中的元素類型。
泛型方法:在方法上聲明泛型
情況1:泛型類中的泛型只適用於非靜態方法,如果需要給靜態方法設置泛型,此時使用泛型方法
情況2:泛型類中的方法
一般的,把自定義的泛型作為該方法的返回類型才有意義,而且此時的泛型必須由參數設置進來的。如果沒有參數來設置泛型的具體類型,此時的方法一般返回設計Object即可。
Java集合基礎