每日一个java基础知识点【map】


前言

总所周知,在小企业的面试中,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的索引的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值