1、類集結構
(1)類集的產生目的
類集簡單來講就是一個動態的物件陣列,此物件陣列可以改變大小,可以任意的實現物件的增加、刪除、輸出。所有的類集存放java.util包中。
(2)類集的劃分
1、存放單值:Collection
2、存放一對值:Map
3、輸出:Iterator
(3)類集的具體概念
<1>Collection(只能存放一個值)
|- 主要功能:用於輸出使用
|- 子介面:List(允許有重複的元素,而且加入的順序就是輸出的順序)
|- 子類:ArrayList,是在Java 2之後推出的,是新的類,是使用非同步處理方式,其效能較高
|- 子類:Vector,是在JDK 1.0的時候就推出,因為是舊的類,有很多List所沒有的功能,是使用同步處理方式,其執行緒安全性較高,會比較慢。使用Vector除了可以使用Iterator輸出之外,也可以使用Enumeration進行輸出。兩者是通用的。Vector子類允許直接使用addElement(Object obj),也是可以向集合中加入元素的。
|- 自己新增的方法:
|- 取每一個物件:public Object get(int ind) ;
|- 子類:Stack(棧)
|- 子介面:Set(不允許有重複元素,重複元素會替換)?如何可以區分重複元素呢?
|- 子類:HashSet:是無序列存放
|- 子類:TreeSet:有序存放,是通過Comparable介面完成的
|- 常用方法:
|- 增加一個物件:public boolean add(Object obj)
|- 取得類集的長度:public int size() ;
|- 判斷集合中的內容是否為空:public boolean isEmpty()
|- 刪除一個物件:public boolean remove(Object obj) :就必須牽扯到物件的比較狀態。
|- 例項化Iterator物件:public Iterator iterator() ;
<2>JDK 1.5提供了一個方便的輸出操作:for…each語句。
<3>Iterator介面輸出是最常見的
|- 常用方法
|- public boolean hasNext():判斷是否有下一個元素
|- public Object next():取出下一個元素
|- 子介面:ListIterator,可以進行雙向輸出,只對於List介面有用
|- 常用方法:具備了Iterator介面中的全部內容
|- public boolean hasPrevious()
|- public Object previous()
<4>Enumeration(在1.5之後也加入、泛型支援哈~)
|- 常用方法:
|- 判斷是否有下一個元素:public boolean hasMoreElements()
|- 取出元素:public Object element()
5、 Map(存放一對值)
|- 功能:與Collection的功能不一樣,Map的主要功能是用於查詢使用的。
|- 注意點:
|- 使用Map操作時,不能直接使用Iterator進行輸出。
|- 而且裡面不能有重複key。
|- 如果非要使用Iterator進行輸出,則必須按以下的步驟進行操作:
|- Map --> Set --> Iterator --> Map.Entry --> key與value的分離
|- 常用子類:
|- HashMap:無序存放,是新的類,是JDK 1.2時推出的,是非同步處理,效能較高
|- Hashtable:是舊的類,是JDK 1.0時推出的,是執行緒安全的,效能較低
|- Properties(重點):屬性檔案操作類
|- TreeMap:有序存放
|- 常用方法:
|- 向集合中儲存資料:public Object put(Object key,Object value):返回的是value
|- 從集合中查詢資料:public Object get(Object key):根據key查詢。
|- 將Map資料變為Set例項:Set<Map.Entry<K,V>> entrySet()
|- 將全部的key變為set例項:Set keySet()
|- 將全部的vlaue變為Collection介面例項:Collection values()
|- Map.Entry:儲存key與value
|- public Object getKey()
|- public Object getValue()
|- 存放key的注意點:
################Michael分割線####################
2、程式碼講解
(11)HashMap
Map的基本應用
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/b974820f9b5571f8f80079bb86138c61bb76c24745d1c2413b094103010d912a.png)
如果查到了,則返回具體的值,如果沒有查到,則返回null
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/2d6a5eb0fae59f79b487fcc6f12b2e308287aba81659121d9c0e234d3a084f7d.png)
使用Iterator輸出Map介面中的內容
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/f138f89e51bf409f427eae627305af472fde608e6366fc81b09767f9c7dccf23.png)
HashSet:是無序列存放滴~~~
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/58741ebb2eb869b6e25dc1564192292cb671d3001d9dc5a7882f9ee3ac06594c.png)
將全部的key進行輸出
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/9e7740ca8a7415509242bb225e521a349def9210ea703022978ba2ca10d2ba8c.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/49cfcb0aff6499647ee9080672898d1f79f88ccde60af354ace274792cb49219.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/042c983e78d81652bb6f50e0f849c873d803ec426736b3116707c13ddd10e248.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/b0fbbb654664ae83070cfbb21a423e8d0e933e72c367779e0b663c1a4801e834.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/74479758071b14cbefed10283df2f40bedff05d0b353aae84ea4d13cc40f6c62.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/547a72d42e2578f8e26154f8ab3094aa03d7f1873a8a5e66dc179cf6247377b8.png)
(13)TreeMap
按key進行排序,本操作中依然使用了Comparable介面。
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/c858d2dba0b0cfae1bd8904f93971472dcd45f7188c216aabef0a2fcda52501b.png)
TreeSet:有序存放,是通過Comparable介面完成的
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/231e8a3537d77195e8e1250b03b5e3265823176d14bc00389c4f3fbe5636faee.png)
入棧:public Object push(Object obj)
出棧:public Object pop()
注意點:如果此時棧中已經沒有內容了,則會出現異常。
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/9a57f67bfabd9590604dcf39121bfd2110769005f9fe7536e3a268c1484d354e.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/5398ec5565354235e4ce69277d816f81c59cfaadadc3a122a4364d587f980f40.png)
· 屬性操作類,所有的key 與value 都按屬性設定,都是字串。而且此屬性檔案可以直接儲存在檔案中,或從檔案中讀取出來。
設定屬性:public Object setProperties(String key,String value)
取得屬性:
|- public String getProperty(String key) :根據key讀取屬性,返回值
|- public String getProperty(String key,String def) :如果沒有讀到值,則返回def指定的內容。
儲存在檔案中:
|- 儲存成普通檔案:public void store(OutputStream out,String comments) throws IOException
|- 儲存成XMl檔案:public void storeToXML(OutputStream out,String comments) throws IOException
從檔案中讀取屬性:
|- 從普通檔案中讀取:public void load(InputStream input) throws IOException
|- 從XML檔案中讀取:public void loadFromXML(InputStream input) throws IOException
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/9bc92db25603485ae2aece923cbab5a5ad9078409b622642042882613aa9126a.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/50b5ad4f2ea2d543deb8e67bbc2a51c04de932c91485233b5620d6414764a41e.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/64ebe5309b90245b68194bb8e3e2806fc8540d2e4658d19f2fc3401ea24b6598.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/991f413e7bae10a2cbcba038f779fbb165e192e8da3b48ac3405520fc743777e.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/238fa5c5ed232fd042b034dac9e2836dac5d55a5cd95b783150a029e3deff0a5.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/560073f0df11a80c9ac3d3f26155827e9ae68ac575382f89264efff1d96e223e.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/57b7b429d6bbddf63aea37e42b1d639c5b99e3a2fe7447f6eef131cba21be2a6.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/22d06ee6e268e5ec7927d1b59e397d68a690cb3ce3315d9373ade970e432e3ef.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/cb27e48f999cb3041b6202bd844e7cf235b070f05d703c3f69ed0af821d63486.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/e715c9c8b7af45eaeaca7cd0634129c2c83099a074182c32247bcca7e2c0041a.png)
現在把程式碼反過來
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/9b05bcc10c4d26369a16c8e834c4e37cc9074f00d89d668fdd26b895215f9411.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/c2b841f9fc684e92307eca0d750cb67137a5834a96999d250c503d8cd04989bd.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/09c577c273fd7c2acd28b8ed61031454643f12eec83bbfd031da38162a1c2bb7.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/28734f249a2ef8183bd25dc85f56eebfb5d7087f2bc2a8c8de9ee543579c6c8f.png)
此時如果要通過匿名物件來當作key,找到屬性的話,就必須牽扯到Object中的幾個方法:
· 物件比較:
· 通過hashCode;
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/3970ea1e9e4acd9067897f852545c491926f3e786b9314aea392fbaf54618ae1.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/92e7d786436548e8a562c110284cc4542b5475e7ed5185ed8f191e7321146444.png)
但是以上的程式需要一點更改,因為不能讓所有物件的hashCode方法的返回值都是一樣的,所以可以經過一些自己簡單的運算。
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/63cb75637f491cbdcdaec01631e71c693ba7f6fa1cfdd4fb47393980340765ac.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/23599dadd8700d403bc3dc868e4d7ebc1a2fe295c88cbe058111480e5ecf440b.png)
· hashCode
· equals
· toString
(17)額外補充(物件克隆)
就是把物件的內容重新複製一份,複製出一個新的物件
protected Object clone() throws CloneNotSupportedException
克隆方法是一個受保護的方法。所以在其需要物件被克隆的子類中必須擴大許可權,否則外部無法看見。
物件所在的類必須實現Cloneable介面
Java程式中常用的有兩大標識介面:
· 可序列化:Serializable
· 可克隆:Cloneable
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/2f9c494538e62d5ced134f39b6421c1510258e020923e7ef74dc7e350545ac02.png)
![[零基礎學JAVA]Java SE應用部分-35.JAVA類集之四](https://i.iter01.com/images/b2620975578f19585ed7a365301dfa3727119e4fdfccbe9182e986303025f0ec.png)
就是向裡面不斷加入元素,可以動態的擴充,而且可以有存放單值的,也可以有存放一對值的。
而且在集合中對於排序,使用的是Comparable介面。
例項的模型很重要 —— Hibernate、EJB 3.0
歡迎工作一到五年的Java工程師朋友們加入Java架構師:697558955
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!