HashMap的底层是数组+链表的形式,jdk1.7之后加入了红黑树,当链表的长度达到8,数组长度大于等于64,实际情况在负载因子loadFactor(0.75)扩容机制和HashCode()方法上使用红黑树概率比较小。它通过异或的方式将当前表的长度-1和传过来的hash异或得到表的位置(tab[i = (n - 1) & hash]),所以链表比较难以达到8,所以它会一直以2倍的大小去扩容表。
遍历HashMap集合的方式可以通过map.keySet拿到key集合,然后遍历取出对应的value,也可以直接通过map.values()取到所有的value,第三也可以用map.entrySet获得entry,然后向下转型。
public class HashMapStudy {
public static void main(String[] args) {
Map map = new HashMap();
map.put("A001","三国演义");
map.put("B002","西游记");
map.put("C003","一半是海水一半是火焰");
// 1、 把key值取出
Set keySet = map.keySet();
System.out.println("===========第一种方式遍历========");
for (Object key : keySet) {
System.out.println(key + "--" + map.get(key));
}
Iterator iterator = keySet.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next + "--" + map.get(next));
}
//2、把所有的value取出
System.out.println("===========第二种方式遍历========");
Collection values = map.values();
for (Object value : values) {
System.out.println(value);
}
//3、通过EntrySet 来获取
Set set = map.entrySet();
System.out.println("===========第三种方式遍历========");
for (Object entry : set) {
//将entry 转成map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "--" + m.getValue());
}
}
}