Java集合框架总结(5)——Map接口的使用
Java集合框架總結(5)——Map接口的使用
Map用于保存具有映射關系的數據(key-vlaue)。Map的key不允許重復,即同一個Map對象的任何兩個key通過equals方法比較總是返回false
Map中包含了一個keySet()方法,用于返回Map所以key組成的Set集合。
??? Map集合與Set集合元素的存儲形式很像,如Set接口下有HashSet、LinkedHashSet、SortedSet(接口)、TreeSet、EnumSet等實現類和子接口,而Map接口下則有HashMap、LinkedHashMap、SortedMap(接口)、TreeMap、EnumMap等實現類和子接口。
?
??? Map的value非常類似List:元素與元素之間可以重復,每個元素可以根據索引(key)來查找。
??? Map有時也稱為字典,或關聯數組。
Map接口中定義如下方法:
- void clear();刪除Map對象中所有key-value對。
- boolean?containsKey(Object key):查詢Map中是否包含指定key,如果包含則返回true。
- boolean?containsValue(Object value):查詢Map中是否包含一個或多個value,如果包含則返回true。
- Set entrySet():返回Map中所有包含的key-value對組成的Set集合,每個集合元素都是Map.Entry(Entry是Map的內部類)對象。
- Object get(Obejct key):返回指定key所對應的value;如果此Map中不包含key,則返回null。
- boolean isEmpty():查詢該Map是否為空(即不包含任何key-value對),如果為空則返回true。
- Set?keySet():返回該Map中所有key所組成的set集合。
- Object put(Object key, Object value):添加一個key-value對,如果當前Map中已有一個與該key相等的key-value對,則新的key-value對會覆蓋原來的key-value對。
- Object remove(Object key):刪除指定key對應的key-value對,返回被刪除key所關聯的value,如果該key不存在,返回null。
- int size():返回該Map里的key-value對的個數。
- Collection values():返回該Map里所有value組成的Collection。
??? Map接口提供了大量的實現類,如HashMap和Hashtable等,以及HashMap的子類LinkedHashMap,還有SortedMap子接口及該接口的實現類TreeMap。下面將進行詳細介紹。
????Map中包括一個內部類:Entry。該類封裝了一個key-value對,Entry包含三個方法:
- Object getkey():返回該Entry里包含的key值。
- Object getValue():返回該Entry里包含的value值。
- Object setValue():設置該Entry里包含的value值,并返回新設置的value值。
??? 可以把Map理解成一個特殊的Set,只是該Set里包含的集合元素是Entry對象,而不是普通對象。
?
1、HashMap和Hashtable實現類
HashMap和Hashtable都是Map接口的實現類,Hashtable是一個古老的Map實現類,它從JDK1.0起就有,它包含兩個煩瑣的方法:elements()(類似于Map接口定義的values()方法)和keys()(類似于Map接口定義的keySet()方法),現在很少使用這兩種方法。
兩點區別:
- Hashtable是一個線程安全的Map實現,但HashMap是線程不安全的實現,所以HashMap比Hashtable的性能高些;但如果多線程訪問同一個Map對象,使用Hashtable實現類更好。
- Hashtable不允許使用null作為key和value,如果為null,則引發NullPointerException異常;但HashMap可以使用null作為key或value。
由于HashMap里的可以不能重復,所以HashMap里最多只有一對key-value值為null,但可以有無數多項key-value對的value為null。
HashMap重寫了toString()方法方法總是返回如下格式的字符串:{key1 = value1,key2 = value2..}
HashMap、Hashtable判斷兩個key相等的標準是:兩個key通過equasl方法比較返回ture,兩個key的hashCode值相等。
LinkedHashMap類
HashMap有一個子類:LinkedHashMap,它也是雙向鏈表來維護key-value對的次序,該鏈表定義了迭代順序,該迭代順序與key-value對的插入順序保持一致。
LinkedHashMap可以避免對HashMap、Hashtable里的key-value對進行排序(只要插入key-value對時保持順序即可)。同時又可避免使用TreeMap所增加的成本。
LinkedHashMap需要維護元素的插入順序,因此性能略低于HashMap的性能,但在迭代訪問Map里的全部元素時將有很好的性能,因為它以鏈表來維護內部順序。
Properties類
Properties類是Hashtable類的子類,用于處理屬性文件(例如Windows操作平臺上的ini文件)。Properties類可以把Map對象和屬性文件關聯起來,從而可以把Map對象中的key-value對寫入屬性文件,也可以把屬性文件中的屬性名=屬性值加載到Map對象中。由于屬性文件里的屬性名、屬性值只能是字符串類型,所以Properties里的key、value都是字符串類型,該類提供了如下三個方法來修改Properties里的key、value值。
提供兩個讀、寫屬性文件的方法:
示例程序:
public class TestProperties {public static void main(String[] args) throws Exception{Properties props = new Properties();//向Properties中增加屬性props.setProperty("username" , "yeeku");props.setProperty("password" , "123456");//將Properties中的屬性保存到a.ini文件中props.store(new FileOutputStream("a.ini") , "comment line");//新建一個Properties對象Properties props2 = new Properties();//向Properties中增加屬性props2.setProperty("gender" , "male");//將a.ini文件中的屬性名-屬性值追加到props2中props2.load(new FileInputStream("a.ini") );System.out.println(props2);} }?
?
運行結果:
{password=123456, gender=male, username=yeeku}
?
2、SortedMap接口和TreeMap實現類
Map接口派生了一個SortedMap子接口,TreeMap為其實現類。類似TreeSet排序,TreeMap也是基于紅黑樹對TreeMap中所有key進行排序,從而保證TreeMap中所有key-value對處于有序狀態。TreeMap兩種排序方法:
TreeMap中判斷兩個key相等的標準也是兩個key通過equals比較返回true,而通過compareTo方法返回0,TreeMap即認為這兩個key是相等的。
如果使用自定義的類作為TreeMap的key,應重新該類的equals方法和compareTo方法時應有一致的返回結果:即兩個key通過equals方法比較返回true時,它們通過compareTo方法比較應該返回0。如果equals方法與compareTo方法的返回結果不一致,要么該TreeMap與Map接口的規則有出入(當equals比較返回true,但CompareTo比較不返回0時),要么TreeMap處理起來性能有所下降(當compareTo比較返回0,當equals比較不返回true時)。
TreeMap中提供了系列根據key順序來訪問Map中key-value對方法:
程序示例:
//R類,重寫了equals方法,如果count屬性相等返回true //重寫了compareTo(Object obj)方法,如果count屬性相等返回0; class R implements Comparable {int count;public R(int count){this.count = count;}public String toString(){return "R(count屬性:" + count + ")";}public boolean equals(Object obj){if (this == obj){return true;}if (obj != null&& obj.getClass() == R.class){R r = (R)obj;if (r.count == this.count){return true;}}return false;}public int compareTo(Object obj){R r = (R)obj;if (this.count > r.count){return 1;}else if (this.count == r.count){return 0;}else{return -1;}} } public class TestTreeMap {public static void main(String[] args){TreeMap tm = new TreeMap();tm.put(new R(3) , "輕量級J2EE企業應用實戰");tm.put(new R(-5) , "Struts2權威指南");tm.put(new R(9) , "ROR敏捷開發最佳實踐");System.out.println(tm);//返回該TreeMap的第一個Entry對象System.out.println(tm.firstEntry());//返回該TreeMap的最后一個key值System.out.println(tm.lastKey());//返回該TreeMap的比new R(2)大的最小key值。System.out.println(tm.higherKey(new R(2)));//返回該TreeMap的比new R(2)小的最大的key-value對。System.out.println(tm.lowerEntry(new R(2)));//返回該TreeMap的子TreeMapSystem.out.println(tm.subMap(new R(-1) , new R(4)));} }?
運行結果:
{R(count屬性:-5)=Struts2權威指南, R(count屬性:3)=輕量級J2EE企業應用實戰, R(count屬性:9)=ROR敏捷開發最佳實踐}?
R(count屬性:-5)=Struts2權威指南?
R(count屬性:9)?
R(count屬性:3)?
R(count屬性:-5)=Struts2權威指南?
{R(count屬性:3)=輕量級J2EE企業應用實戰}
轉載于:https://www.cnblogs.com/tangyizhuo/p/6099875.html
總結
以上是生活随笔為你收集整理的Java集合框架总结(5)——Map接口的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bug测试报告--食物链教学工具--奋斗
- 下一篇: Java字节码(.class文件)格式详