Java心得--键值、枚举器
1. 集(Set):和數(shù)學(xué)上的“集合”概念相對(duì)應(yīng),是最簡(jiǎn)單的一種集合。
Set集合中不區(qū)分元素的順序,因此也就不記錄元素的加入順序。
Set集合中不包含重復(fù)元素,即任意的兩個(gè)元素e1和e2都有e1.equals(e2)=false,并且最多有一個(gè)null元素。
2. 實(shí)現(xiàn)了Set接口的類HashSet
“基于散列表”的檢測(cè)重復(fù)元素的策略:HashSet里的元素值同這個(gè)元素在Set里所存放的索引位置有個(gè)對(duì)應(yīng)關(guān)系(散列函數(shù)),在HashSet里插入元素前,可根據(jù)這個(gè)元素值和對(duì)應(yīng)關(guān)系,計(jì)算出這個(gè)元素在HashSet里的插入位置,如果在這個(gè)位置里(或位置周圍)已經(jīng)存在了待插入元素的值,則不能插入。?
μ???構(gòu)造方法
ü????HashSet()
ü????HashSet(<E> c)
μ???其他方法
ü????boolean contains(Object o) 判斷是否存在指定元素
????????? 剩下繼承父類的方法!該類中沒(méi)有g(shù)et方法。
4.????? 第一類集合有著共同的特性:它們存儲(chǔ)的對(duì)象都是一元的(線性的),只不過(guò)存儲(chǔ)的方式和使用的數(shù)據(jù)結(jié)構(gòu)不同,以Collection為基類--封裝了線性表的插入、刪除等基本操作。
第二類集合的共同特性就是它們存放的數(shù)據(jù)都是二元的,稱其為“鍵-值”對(duì),通過(guò)它們可以快速的根據(jù)一個(gè)關(guān)鍵字key來(lái)得到其所對(duì)應(yīng)的值value,這里之所以稱其為關(guān)鍵字就是因?yàn)樗仨毷俏ㄒ坏?#xff0c;這樣才能保證每次通過(guò)key所得到的value是固定的,即最近一次設(shè)置進(jìn)去的那個(gè)值value.
List接口和Set接口都是Collection的子接口??????????????????????????
????? 實(shí)現(xiàn)List接口:基于線性鏈表來(lái)存放數(shù)據(jù)的,例如Vector
???? ?實(shí)現(xiàn)Set接口:它們不允許有重復(fù)的元素,且元素?zé)o序(取出的元素跟加入的順序沒(méi)關(guān)系);例如HashSet。
5. 在Java中,專門建立以Hashtable為代表的“鍵-值”對(duì)類型對(duì)象,“鍵”--索引信息,而“值” –同索引值相對(duì)應(yīng)的信息。
ˉ???為什么要使用“鍵-值”對(duì)型的數(shù)據(jù)結(jié)構(gòu)
μ???原因:便于信息檢索,提高在大數(shù)據(jù)量里檢索信息的速度。
μ???工作原理
(1)如果要從其中查詢指定數(shù)據(jù)的話,不得不依次遍歷這個(gè)數(shù)組,這樣效率會(huì)很低。
(2)換一種思路:將10存入數(shù)組不是插入在第一個(gè)空閑空間里!
μ???存在“索引沖突” 問(wèn)題:對(duì)于散列函數(shù),不同的“值”會(huì)得到相同的“鍵”,即不同的對(duì)象可能存放在同一個(gè)索引位置上。
μ???解決方法
ü????采用技術(shù)上的方法,例如設(shè)計(jì)出盡量降低沖突情況出現(xiàn)的散列函數(shù),或者是指定沖突發(fā)生時(shí)的應(yīng)對(duì)策略;
ü????根據(jù)待存儲(chǔ)的數(shù)據(jù)量,適當(dāng)提高Hash表的容量--用加大空間的代價(jià),來(lái)取沖突發(fā)生的低概率
新問(wèn)題:如何根據(jù)Hash表里的存儲(chǔ)數(shù)據(jù)量,開辟Hash表的存儲(chǔ)空間?
è裝載因子:Hash表里實(shí)際容納對(duì)象的比率,75%最合適
6. “鍵-值”對(duì)的典范——Hashtable類
在Java的“鍵-值”對(duì)型集合類里,已經(jīng)封裝了用散列函數(shù)優(yōu)化其中數(shù)據(jù)搜索效率以及處理Hash表里數(shù)據(jù)沖突的實(shí)現(xiàn)細(xì)節(jié)。其中Hashtable是 “鍵-值”對(duì)型集合類的典范。
μ???構(gòu)造方法
ü????Hashtable()
ü????Hashtable(int initialCapacity)
ü????Hashtable(int initialCapacity, floatloadFactor)
ü????Hashtable(<K,V> t)
μ???其它方法
ü????V put(K key, V value):向Hashtable對(duì)象中插入“鍵-值”對(duì)
ü????V get(Object key):根據(jù)key這個(gè)“鍵”從Hashtable對(duì)象中檢索到 對(duì)應(yīng)的“值”
例如,ht.put(new Integer(1),new String(“Tom”));
????????? Stringstr=ht.get(new Integer(1));
ü????boolean containsKey(Object key)
判斷“鍵”是否存在于Hashtable對(duì)象中。
ü????boolean containsValue(Object value)
判斷“值” 是否存在于Hashtable中。
例如,boolean flag=ht.containsKey(new Integer(2));
? ?????????flag=ht.containsValue(“Rose”);
ü????public boolean contains(Object?value) 同containsValue()方法。
ü????public void clear()
將此Hashtable清空,使其不包含任何鍵。
7.?? 枚舉器是一個(gè)用來(lái)訪問(wèn)集合元素的工具,它不僅提供了可以用來(lái)訪問(wèn)集合的若干方法,更展示了解決訪問(wèn)對(duì)象時(shí)“對(duì)象類型不確定”難題的思路。
ˉ?????訪問(wèn)集合類的“不確定性”難題
????? Java中有諸多不同類型的Java集合類(比如Vector或List),程序員希望用同一類型的方式來(lái)訪問(wèn)其中的數(shù)據(jù)。
ˉ?????枚舉器接口
?????java.util.Iterator(枚舉器接口)封裝“無(wú)差別訪問(wèn)集合對(duì)象”的方法。
8. 相關(guān)方法
ü????在每一個(gè)集合類(比如Vector或Hashtable等)里,都有一個(gè)iterator()方法,各集合對(duì)象可以通過(guò)該方法把遍歷本類的控制權(quán)交給Iterator接口。
ü????在Iterator的接口里,提供了boolean hasNext()方法,判斷出是否可以通過(guò)枚舉器來(lái)得到集合對(duì)象中的下一個(gè)元素。
ü????在Iterator的接口里,提供了E next()方法,用來(lái)獲取集合對(duì)象里的下一個(gè)元素,它返回的是一個(gè)泛型對(duì)象。
9.枚舉器“分離”思想
μ???“遍歷不同種類的集合對(duì)象” 采用“分離”的設(shè)計(jì)思想;
μ???把遍歷這個(gè)業(yè)務(wù)動(dòng)作同將要實(shí)施遍歷操作的對(duì)象(比如集合)分離,在這個(gè)基礎(chǔ)上,抽象出遍歷不同集合對(duì)象的共性代碼,并把這些功能代碼封裝到枚舉器這個(gè)接口里,就可以用同一套代碼,來(lái)遍歷不同類型的集合;
μ???正是由于枚舉器分離了業(yè)務(wù)動(dòng)作(枚舉)和業(yè)務(wù)動(dòng)作要操作的數(shù)據(jù)(集合),所以它才能以不變應(yīng)萬(wàn)變。
10.倒包時(shí),用具體類或*是一樣的,不影響運(yùn)行速率。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangkai-cn/archive/2012/04/28/4017182.html
總結(jié)
以上是生活随笔為你收集整理的Java心得--键值、枚举器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算 字符串的长度
- 下一篇: 给 Javascript 加上面向对象的