课程名称:Map从入门到性能分析
课程章节:第2章 HashMap的使用
课程讲师: 大谷
课程内容:
一、hashMap基本用法
1、hashMap的构造方法
HashMap()
HashMap(int InitialCapacity)
HashMap(int InitialCapacity,float loadFactor)
创建hashMap对象:
Map<String,Object> userMap = new hashMap();
Map<String,Object> userMap = new hashMap<String,Object>();
userMap.put("zhangsan",new Integer(120));
userMap.get("zhangsan");
2、hashMap的Entry结构
static class Entyr<K,V> implements Map.Entry<k,v> {
final K key;
V value;
Entry<K,V> next;
final int hash;
}
put方法每插入一个键值对,即往hashMap中新增一个Entry
3、hashMap的遍历-keySet
for(String key : map.keySet()){
System.out.println(key + ">>>" + map.get(key));
}
优势:既可以获得key自身,也可以获取key对应的value
4、hashMap的遍历-values
for(String v : map.values){
System.out.println("value = " + v);
}
特点:只能获取map的value值,无法获取key
5、hashMap的遍历-entrySet
for(Map.Entry<String, String> entry : map.entrySet()){
System.out.println(entry.getKey() + ">>>" + entry.getValue());
}
5、hashMap的遍历-iterator
Iterator<Map.Entry<String,String>> it = map.entrySet().iterator;
while(it.hasNext()){
Map.Entry<String,String> entry = it.next();
System.out.println(entry.getKey() + ">>>" + entry.getValue());
}
6、hashMap的遍历-性能分析
entrySet、iterator性能较好,使用频率较高,keySet性能最差
二、hashMap例题
将5个小Map存入1个大Map或List中
三、hashMap的底层原理
遍历输出的顺序与put存进去的顺序无关,那是按什么规律输出的呢?
Key转换哈希码后除16余数
1、关键的两个方法:
1)final int hash(Object k)
用hashCode()方法将key转换成hash码后,并进行优化得到优化后的hash码
例:将“yuwen”这个字符串优化后的hash码是115347492
2)static int indexFor(int h,int length)
对优化后的hash码进行取址,确定在HashMap的位置
例:115347492的长度是16的HashMap中,取址的坐标是4
3)HashMap不带参的构造方法
Map map = new HashMap();
默认长度是16,默认的负载因子是0.75,等同于Map map = new HashMap(16,0.75f);
4)HashMap带参的构造方法
HashMap(int initialCapacity) //例如 new HashMap(3)
传递的参数转化为大于它的最小的2的N次方,即4.
例:new hashMap(5):初始化的长度就是5吗?
HashMap(int initialCapacity,float loadFactor) //负载因子
例:new hashMap(10000,0.75f),要录入的数据是10000条,会产生扩容吗?
结果:2的14次方=16384*0.75=12288,大于10000,所以不会产生扩容
2、常用方法
1)判断是否为空、删除节点、清空HashMap对象
Map<String,String> map1 = new HashMap<String,String>();
map1.isEmpty(); //判断是否为空
map1.remove(key)、map1.remove(key,value); //删除节点
map1.clear(); //清空HashMap对象
2)判断是否有某个key、是否有某个value
map1.containsKey(key);
map1.containsValue(value);
3)替换某个key的value
map1.replace(key,newValue);
map1.replace(key,oldValue,newValue);
map1.put(oldKey,newValue);
map1.putIfAbsent(key,value); //key不存在时,则新增键值对
4)map循环(Lamada表达式:->)
map.forEach((key,value) -> System.out.println(key+":"+value));
map.forEach((key,value) -> {
System.out.println(key+":"+value);
});
5)key存在则输出value,不存在则输入默认值
getOrDefault(key,defaultValue);
课程收获:
map日常使用频率很高,本次课程对HashMap底层原理的讲解浅显易懂,多个常用方法非常实用,期待后面的课程。