手记

【备战春招】第12天 Map从入门到性能分析

课程名称: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底层原理的讲解浅显易懂,多个常用方法非常实用,期待后面的课程。


0人推荐
随时随地看视频
慕课网APP