HashMap和ArrayList的原理

HashMap

1、首先我们从源码来分析HashMap的常用的一些方法的底层是怎么实现的。首先来写一个main方法,方法中实例化一个HashMap。


public class JDK18 {

	public static void main(String[] args) {

		Map<String,String> map = new HashMap<String,String>();

		map.put("1", "2");

	}

}



在这里可能有小伙伴问为什么前面用 Map<String,String> map后面用 new HashMap<String,String>();为什么不直接写一个Map<String,String> map = new Map<String,String>();呢,为什么非要用HashMap呢,因为Map是一种集合类型,他是以一个key,value键值对方式进行存储的,但是这钟键以什么样的算法来生成数据存储到我们的空间中是不同的,所以由于算法的不同,map也有不同的实现方式,比如HashMap、TreeMap、ConrrentHashMap等,而且Map只是一个接口,里面只有接口方法而没有实现,而这些HashMap继承并实现了Map的接口,所以我们需要new一个具体的Map类才可以使用。下面我们按住ctrl点击put进入。

在这里插入图片描述

在这里插入图片描述

我们可以看到源码,如果你点击不能够看到源码证明你还没有配置,你可以根据网上的教程配置一下源码就可以看源码了。这里我们可以看到我们进入的是Map.class类当中,前面我们说过Map类只是一个接口类,里面只定义了接口并没有实现,所以我们复制一下put方法去HashMap.class类中搜索这个方法。

在这里插入图片描述

这里我们找到了这个方法,但是他还return了一个putVal方法,我们一会要点进putVal这个方法来查看具体的算法,这个时候我们看到putVal方法的第一个参数是将我们输入的key值做了一个hash()操作,这个时候我们点击这个hash方法里面查看一下。

在这里插入图片描述在这里插入图片描述

点进去我们可以看到如下的一个三元运算

在这里插入图片描述

这里如果传入的key是null,就返回0,这个先不关注,先看有key值的时候是怎么计算的,有key值的话首先对key进行一个key.hashCode()方法的调用,我们点击去这个方法可以看到

在这里插入图片描述

他是一个用native修饰的方法,在这里说一下用native修饰的方法是底层用c语言封装的一个方法,我们在这里无法看到,但是我们可以用String new一个字符串然后调用hashCode()方法输出一下,比如String str = ‘a’;,那么他的hashCode()方法输出来的是97,这里是不是跟ASSIC很像,这个hashCode()是一个怎样的算法我们后期再讨论,这里我们先明白首先把我们的key值调用了一个hashCode()方法的运算,然后再^上一个h的无符号右移16位。

在这里插入图片描述

这里的无符号右移我们java基础中都学过例如h的二进制为下面这样

00000000 10101010 01010101 10101010

当我们无符号右移16位后就变成了这样

00000000 00000000 00000000 10101010

我们从左往右移动了16位,空出来的位置都用0来填充,最后将右移后的二进制与h的二进制来进行^操作,这样就是得到的key值,为什么要进行一个这样的异或操作呢,是为了让结果更加散列,这样的话可以减少Hash碰撞的几率。

ArrayList

我们接下来看一下ArrayList的源码,我们首先写一个简单的实例

在这里插入图片描述


List<String> list = new ArrayList<String>();

        list.add("1");



然后我们点击去看add方法

在这里插入图片描述

最后

小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。

关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。

image

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!
图片转存中…(img-K3LblWUC-1721134604210)]

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值