今天講解的主要是使用多種方式來實現遍歷HashMap取出Key和value,首先在java中若是想讓一個集合可以用for加強來實現迭代,那麼此接口或類必須實現Iterable接口,那麼Iterable到底是如何來實現迭代的,在這裏將不作講解,下面主要講解一下遍歷過程。java
1 //定義一個泛型集合 2 Map<String, String> map = new HashMap<String, String>(); 3 //經過Map的put方法向集合中添加數據 4 map.put("001", "劉備"); 5 map.put("002", "曹操"); 6 map.put("003", "孫權");
方式一:使用該Map接口的KeySet方法來實現數組
問題:咱們都知道Map接口並無實現Iterable接口,爲何能用他的KetSet方法就能實現迭代呢?測試
解析:由於KeySet方法返回此映射中包含的鍵的 Set 視圖,這個方法居然能返回一個Set試圖,也就說他的返回值類型是一個Set接口,咱們能夠經過API文檔看到Set接口他是實現了Iterable接口,因此能實現迭代。spa
1 //調用KeySet方法放回一個Set接口類型 2 Set<String> set = map.keySet(); 3 //使用for加強來取出key和value 4 for (String item : set) { 5 System.out.println("Key是:" + item + ";Value值是:" + map.get(item)); 6 }
方式三:使用Map接口的entrySet方法實現(for加強)設計
entrySet:entrySet()的返回值也是返回一個Set集合,此集合的類型爲Map.Entry,Map.Entry是Map聲明的一個內部接口,此接口爲泛型,定義爲Entry<K,V>。它表示Map中的一個實體(一個key-value對)。code
1 Set<Entry<String, String>> setentry = map.entrySet(); 2 for (Entry<String, String> item : setentry) { 3 System.out.println("Key是:" + item.getKey() + ";Value值是:" 4 + item.getValue()); 5 }
java中迭代器Iterator接口是用來對集合中的對象進行遍歷或者移除操做的,大多數是遍歷操做的
下面介紹迭代器的使用:對象
ArrayList list=new ArrayList(); list.add("A"); list.add("B"); list.add("H"); list.add("E"); list.add("J"); Iterator ite=list.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); }
方式四:使用Map接口的keySet().Iterable()(while循環)blog
Iterable():返回在此 set 中的元素上進行迭代的迭代器。返回的元素沒有特定的順序(除非此 set 是某個提供順序保證的類的實例)。返回值類型Iterator<E接口
1 Iterator<String> it = map.keySet().iterator();//若是仍有元素能夠迭代,則返回 true。 2 while (it.hasNext()) { //獲取Key值 3 String key = it.next(); 4 System.out.println("Key是:" + key + ";Value值是:" + map.get(key)); 5 }
方式五:使用Map接口的value.Iterable()(while循環)rem
1 Iterator<String> it1 = map.values().iterator(); 2 while (it1.hasNext()) { 3 String value = it1.next(); 4 System.out.println("Value值是:" + value); 5 }
方式六:使用Map接口的entrySet().Iterable()(while循環)
1 Iterator<Entry<String, String>> it2 = map.entrySet().iterator(); 2 while (it2.hasNext()) { 3 Entry<String,String> entry=it2.next(); 4 System.out.println("Key是:" + entry.getKey() + ";Value值是:" + entry.getValue()); 5 }
加強for循環:
設計的本意:拋棄迭代器
加強for循環只能遍歷數組和實現了Iteratable接口的對象。
語法:
for(元素的類型 變量名:數組或實現了Iteratable接口的對象){
System.out.println(變量名);
}
加強for循環的特色:只適合取數據。要想在遍歷時改元素的值,請使用傳統for循環。
列子1:
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class MapDemo { public static void main(String[] args) { Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "花花"); map.put(2, "草草"); map.put(3, "葉葉"); map.put(4, "瓶瓶"); map.put(4, "新瓶瓶"); System.out.println(map); Set<Integer> keySet = map.keySet(); // 測試keyset是不是會跟隨map的變化而變化 // 結果:是 map.put(5, "點點"); map.remove(2); Iterator<Integer> keys = keySet.iterator(); while (keys.hasNext()) { System.out.println(map.get(keys.next())); } Set<Entry<Integer, String>> entries = map.entrySet(); for (Entry<Integer, String> entry : entries) { System.out.println(entry); } // 獲取value Collection<String> collection = map.values(); System.out.println(collection); // 使用for-each輸出value值 for (String string : collection) { System.out.println(string); } System.out.println("使用迭代器遍歷:"); // for語句的使用for(表達式1;表達式2;表達式3){ 內容4 } for (Iterator iterator = collection.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); System.out.println(string); } String[] name = { "tym", "cww", "tym", "flj", "tym", "flj" }; Map<String, Integer> map2 = new HashMap<String, Integer>(); // 在添加過程當中,把value設置爲出現的次數 for (int i = 0; i < name.length; i++) { if (!map2.containsKey(name[i])) { map2.put(name[i], 1); } else { map2.put(name[i], map2.get(name[i]) + 1); } } System.out.println(map2); } }
列子2:
1 //加強for循環 2 public class Demo { 3 //傳統方式遍歷Map 4 @Test 5 public void test3(){ 6 Map map = new LinkedHashMap(); 7 map.put("a", "aaa"); 8 map.put("b", "bbb"); 9 map.put("c", "ccc"); 10 11 Set keys = map.keySet(); 12 Iterator it = keys.iterator(); 13 while(it.hasNext()){ 14 String key = (String)it.next(); 15 String value = (String) map.get(key); 16 System.out.println(key+"="+value); 17 } 18 } 19 20 @Test//加強for遍歷map方式一 21 public void test31(){ 22 Map map = new LinkedHashMap(); 23 map.put("a", "aaa"); 24 map.put("b", "bbb"); 25 map.put("c", "ccc"); 26 27 Set keys = map.keySet(); 28 for(Object obj:keys){ 29 String key = (String)obj; 30 String value = (String) map.get(key); 31 System.out.println(key+"="+value); 32 } 33 34 } 35 //傳統方式遍歷Map 36 @Test 37 public void test4(){ 38 Map map = new LinkedHashMap(); 39 map.put("a", "aaa"); 40 map.put("b", "bbb"); 41 map.put("c", "ccc"); 42 43 Set me = map.entrySet(); 44 Iterator it = me.iterator(); 45 while(it.hasNext()){ 46 Map.Entry m = (Map.Entry)it.next(); 47 String key = (String) m.getKey(); 48 String value = (String)m.getValue(); 49 System.out.println(key+"="+value); 50 } 51 52 } 53 @Test//加強for循環遍歷map方式二 54 public void test41(){ 55 Map map = new LinkedHashMap(); 56 map.put("a", "aaa"); 57 map.put("b", "bbb"); 58 map.put("c", "ccc"); 59 60 for(Object obj:map.entrySet()){ 61 Map.Entry me = (Map.Entry )obj; 62 String key = (String) me.getKey(); 63 String value = (String)me.getValue(); 64 System.out.println(key+"="+value); 65 } 66 67 } 68 }