从一个面试开始来谈Map 的初始容量

从一个面试开始的Map

以下是面试我的面试题。

1、你使用java多久了,在使用java过程中,你和我说一下java 的基本类型,int占用几个字节,它的最大值是多少(用幂指函数形式表示就可以)为什么?

答:byte、short、int。。。。布拉布拉。4个字节,最大是2^31-1(其他的同学面试者回答多少的都有,还有回答是-128--127 的,这个让我真的是一口老血喷出来啊,当时我就说那就是说int a = 1000,这样赋值是不对的喽?)

3、那你在工作中使用过HashMap吗?你可以和我谈谈它吗?

答:key-value形式,线程不安全等等,key可以为null,等等xxxxx

4、那你知道它的初始容量是多少吗?那要是我使用Map map = new HashMap(12);这个在什么时候开始扩容的?

答:初始容量是16,在 12*0.75=9的时候开始扩容 ,这个同学开始一顿 什么加载因子啦一大堆开始了。

5、接着我又问 如果要是 Map  map = new HashMap(11);这个在什么时候开始扩容,这时候面试者语塞了,因为他发现11*075 好像是不知道是多少了,乘出来的不是一个整数,这下子就完全懵逼了。其实的话面试过程中Map这个类有很多的问题要问,但是今天我先和大家来一起讨论以下这个

接下来开始上答案,以jdk1.8版本为例。

其实我们在初始创建一个HashMap 的时候,当我们不给任何参数的时候,各个参数都会使用默认的值。


当我们在初始化 HashMap 的时候,传入相应容量的时候,其实这时候会在 调用 tableSizeFor(int cap) 这个方法,这个方法总会返回2^n 的值。

从下面这个方法可以看出来,你自己可以定义一个扩容因子,例如:Map map = new HashMap(11,0.45f); 但是建议是使用默认的0.75,在这里不做解释为什么,可以自己出门左转 输入www.google.com 之后查查为什么使用0.75。

例如一个数字5,在 二进制中的表示方式是 00000000 00000000 00000000 00000101 ,通过下面的方法是 首先将本上的值减去1,然后不停的右移或上本身的值,这样就是所有的位上都是会1,然后在在通过n+1之后一定是一个2^n 的结果。这就是为什么在开始的时候要减去1的原因。

这样即使是你传入的是一个11,或者是一个其他数的值,那么它开始扩容的时候一定是 2^n * 0.75(这里假如你用的是默认的扩容因子)。

你可能感兴趣的:(从一个面试开始来谈Map 的初始容量)