java里的map接口和python里的map函數完全不同。雖然都具有映射關系,但是java的map接口更貼近字典和集合這兩個引用數據類型。這個接口是一個雙列集合它的元素是由鍵和值組成的,也就是keys和values。這個接口有兩個實現類:hashmap和treemap。hashmap內部維護一個hash順序,所以和我們宏觀里看到的順序不太一樣。下例是把這個集合里的所有的值遍歷出來。


public class Example18 {
public static void main(String[] args) {
//直接獲取map里的值
//map存儲的值是collection集合
Map map = new HashMap();
map.put("1","javaScript");
map.put("2","Linux");
map.put("3","Unix");
Collection values = map.values();//把map對象里的值取出,轉換成collection集合類
Iterator it = values.iterator();
while (it.hasNext()){
Object value = it.next();
System.out.println(value);
}
}
}
這里是通過一個java的迭代器把map里的所有元素迭代出來。這里的get方法是根據輸入的鍵返回對應的值。這里是不允許出現重復的元素,如果輸入了相同的鍵值對,則視為對該鍵對應的值修改。也就是如下例:
map.put("3","MacOS");
也就是把鍵為3的值修改了。簡而言之就是鍵相同,值修改。
很多初學者不適應hashmap里的讀取順序不是按照存入順序讀出來的,所以總想按照宏觀的順序讀取出來,我們可以使用LinkedHashMap類實現這一目的。它是用雙向鏈表來維護內部元素的關系,與LinkedList一樣。如下例:
public class Example19 {
public static void main(String[] args) {
//要想使得map對象里的存入時的值與讀取出來的值順序一致,則需要使用linkedhashmap類
//內部維護一個雙向鏈表
Map map = new LinkedHashMap();//使用linkedhashmap類就實現了存入與讀取順序一致
map.put("1","Ubuntu");
map.put("2","CentOS");
map.put("3","SunOS");
map.put("4","MacOS");
Set keySet = map.keySet();//取出map對象里的鍵組成的集合
Iterator it = keySet.iterator();//為什么是keySet調用迭代器,因為是把鍵取出后存入keySet對象里的
while (it.hasNext()){
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
}
}
}
這樣就是實現了讀取與存放順序一致了。


Treemap集合也是存儲鍵值對映射關系,不允許出現重復的鍵,內部是通過二叉樹原理實現的,所以就可以實現鍵不重復。它是由一個根組成的,往下劃分兩個子樹,由左子樹和右子樹組成,左子樹總是小于右子樹。
public static void main(String[] args) {
//TreeMap集合
//是通過二叉樹原理保證鍵的唯一性。TreeMap是按照某種順序排列的
TreeMap tmap = new TreeMap();
tmap.put("1","java");
tmap.put("2","Linux");
tmap.put("3","MacOS");
tmap.put("4","Ubuntu");
Set keyset = tmap.keySet();
Iterator ior = keyset.iterator();
while (ior.hasNext()){
Object key = ior.next();
Object value = tmap.get(key);
System.out.println(key+":"+value);
}
}
它讀取的元素的順序和存儲的順序一致。因為編號是String類型,String類型實現了Comparable接口,因此默認會按照自然順序進行排序。
當使用TreeMap集合時,也可以自定義比較法。下面的例子就實現了自定義比較器。
public class Example21 {
public static void main(String[] args) {
/*
* 實現自定義比較器,與二叉樹集合默認排序規則相反的排序
* */
TreeMap tm = new TreeMap(new MyComparator());
tm.put("1","JavaScript");
tm.put("2","java虛擬機");
tm.put("3","Linux Kernel");
Set keySet = tm.keySet();
Iterator it = keySet.iterator();
while (it.hasNext()){
Object key = it.next();
Object value = tm.get(key);//獲得鍵對應的值
System.out.println(key+":"+value);
}
}
}
//實現自定義比較器
class MyComparator implements Comparator {
public int compare(Object obj1,Object obj2){
String id1 = (String) obj1; //把obj1強制轉換為String類型
String id2 = (String) obj2;
return id2.compareTo(id1);//把比較結果返回
}
}
jdk幫我們預留了一個接口叫Comparator,我們使用implements實現這個接口。因為在java里所有的類的父類都是Object是默認繼承的。所以在集合中的數據類型都轉成Object類型。那么我們要做的就是把Object類型轉譯成String類型。然后使用compareTo方法進行比較,這樣就實現了字典逆序。
Properties集合是map接口的一個實現類Hashtable與hashMap相似,hashtable的線程是安全的,存取元素時速度慢。Properties主要存儲字符串類型的鍵和值。
public static void main(String[] args) {
//Properties集合是map接口的一個實現類Hashtable與hashMap相似。
//hashtable的線程是安全的,存取元素時速度慢。
//Properties主要存儲字符串類型的鍵和值
//按順序存儲的順序讀取結果
Properties p = new Properties();
p.setProperty("1","C");//寫入Properties集合
p.setProperty("2","JavaScript");
p.setProperty("3","Node.js");
/*
* 通過調用propertyNames方法獲得一個包含所有鍵的Enumeration對象,
* 在遍歷時調用getProperty方法獲取值
*
* */
Enumeration names = p.propertyNames();//獲取Enumeration對象所有鍵的枚舉
while (names.hasMoreElements()){
String key = (String) names.nextElement();
String value = (String) p.getProperty(key);//獲取鍵對應的值
System.out.println(key+":"+value);
}
}
主要用于編寫配置項的,這個我在學Spring Boot這么課的時候經常使用。它有getproperty()和setproperty()這兩個方法,用于讀寫配置。再詳細的就在代碼里寫的很完備了,直接看代碼就可以了。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。