文章目录
- 前言
- 一、Map是什么?
- 二、常见的Map实现类
- 1.HashMap
- 2.LinkedHashMap
- 3.HashTable
- 总结
前言
总所周知,在小企业的面试中,java基础的面试题是必不可少的,其中包括了线程、集合、虚拟机等知识点,所以我出一个《每日一个java基础知识点》这个系列,自己学习的同时,也希望能够帮助到大家。
一、Map是什么?
map,是java中的一个接口,是以键为唯一标识的一个储存容器,它的内部提供entrySet()和getKey()等常用方法。
public class MapTest {
public static void main(String[] args) {
//为了符合阿里巴巴手册规范,尽量为HanhMap赋上初始值(初始值为2的倍数,默认为16)
Map<String, Integer> hashMap = new HashMap<>(16);
hashMap.put("A", 1);
hashMap.put("B", 2);
hashMap.put("C", 3);
System.out.println("hashMap" + hashMap);
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
System.out.println("key=" + entry.getKey() + " and value=" + entry.getValue());
}
System.out.println("通过Map.keySet遍历key和value:");
for (String key : hashMap.keySet()){
System.out.println("key=" + key + " and value=" + hashMap.get(key));
}
}
}
二、常见的Map实现类
1.HashMap
HashMap作为最常用的Map实现类之一,它的特点也十分的鲜明,其中,我个人认为最重要的一点是它是查询速度最快的数据结构,并且它的内部有一个Entry的静态内部类,在这个内部类当中包含了key-value作为实例变量。
它还使用了哈希算法,在put()和get() 方法中,使用了hashCode() 和equals() 方法
关于HashMap的执行原理:数组+链表
在JDK7时,使用的是头插法,在链表发生扩容时会发生链表反转,在多线程的情况下可能会出现死锁问题。
到了JDK8时,变成了头插法,当链表发生扩容时,不会发生反转,解决了多线程下的死锁问题,但是当链表扩容长度超过8时,就会变为红黑树,此时就变成:数组+链表+红黑树
2.LinkedHashMap
LinkedHashMap的原理和HashMap的执行原理相同,其中区别较大一点的是,LinkedHashMap是有序的,而HashMap是无序的。
3.HashTable
HashTable是于JDK1.0的产物,它是线程安全的,因为它的方法都是被synchronized所修饰,但是它的运行效率低下,不怎么被使用,到了JDK5,出现了ConcurrentHashMap,它可以在大多数的场景替代HashTable。
总结
关于Map基本上就说到这,以前也没怎么去太多关注它的原理,现在一看,觉得看了还是很有用的,除了能在面试中自信的回答之外,还能充实自己本身,现在写的代码动不动就是上springboot这些框架,其java底层的东西却不怎么知晓,显得编程者以及代码显得有些许的空洞,下次有时间更一个mysql的索引的。