一.Map接口:
Map(映射):将建映射到值的对象。一个映射不能包含重复的键,每个键最多映射到一个值。
Map中包含了一个Map.Entry的内部接口,此接口是Map中的一个实体(key-value对,键值对),其中有getKey()和getValue()方法。
Map中提供了keySet()和entrySet()方法,keySet()方法返回值是Map中键的集合也就是key值,entrySet()方法的返回值是set集合,该类型是Map.Entry类型的。
Map子接口和实现类:
二.HashMap类:
HashMap是Map接口的常用实现类,与我们前面讲的HashSet的底层存储机制是一样的。
HashMap底层维护着一个Entry类型数组,我们把key-value存入Entry对象中,然后将该Entry对象存入数组。
HashMap中Entry类实现了Map.Entry接口
HashMap是把key-value变成一个整体来进行储存,通过key的hashCode值计算出一个位置,该位置就是此对象将要存入的位置。(Hash就是散列函数,通过它来计算存入数组的位置。)
put方法源码图:
如果在i这个位置没有对象存在,也就是为null,则for()不执行,直接执行下面的代码,向数组中添加对象。如果该位置上存在了对象,则会执行for语句,顺着此存在对象的链开始寻找(Entry类有一个Entry类型的next成员变量指向了下一个对象,也就是链表),如果此链上有对象的话,则再去使用equals()方法进行比较,如果对此链上某个对象的equals()方法比较为false,则将该对象放到数组中,将数组该位置以前存在的那个对象链接此对象后面。
举例:
打印:
A
图解:
三.HashMap遍历:
第一种:
public class Test { public static void main(String[] args) { HashMap map = new HashMap(); map.put("1","A"); map.put("2","B"); map.put("3","C"); map.put("4","D"); Iterator iter = map.entrySet().iterator(); while(iter.hasNext()){ Map.Entry e= (Map.Entry)iter.next(); String key = (String)e.getKey(); String value = (String)e.getValue(); System.out.println(key+":"+value); } } }
打印:
3:C 2:B 1:A 4:D
第二种:
public class Test { public static void main(String[] args) { HashMap map = new HashMap(); map.put("1","A"); map.put("2","B"); map.put("3","C"); map.put("4","D"); Iterator iter = map.keySet().iterator();//返回一个键的集合 while(iter.hasNext()){ String key = (String)iter.next(); String value = (String)map.get(key); System.out.println(key+":"+value); } } }
打印:
3:C 2:B 1:A 4:D