阿里巴巴内推电话面试。第一次面试大型互联网公司,找的学长内部推荐,免掉了评测直接面试。第一次约面试我在外面,不方便,于是改了时间到第二天。晚上九点的时候面试官打来了电话。
面试官:简单介绍一下自己把。
我:balabala。
面试官:我看你用SSH做了个咨询推荐网站是吗?能不能给我详细讲解一下?
我:这是用Spring+struts2+hiberna5做的一个咨询推荐网站,主要功能有。
面试官:那你这个项目是还在跑吗?
我:不是的,是当时我为了参加一个竞赛选择做的一个项目,已经不在跑了。
面试官:那你这个网站能并发多少有了解吗?
我:应该可以三四百这样子把。
面试官:怎么判断的呢?
我:根据一些学校里学生开发的公共网站并发量判断的,他们当时也是用的SSH(其实是要说用JMeter压测过 )
面试官:那你对性能这方面不是很了解嘛,我问你几个java基础把。ArrayList和LinkedList有什么区别?
我:一个底层是数组,一个底层是链表。ArrayList查找更快,时间复杂度是O(1),插入较慢,时间复杂度是O(n);LinkedList查找更慢,时间复杂度是O(2);插入较快,时间复杂度是O(1).
面试官:那为什么会这样啊?
我:因为一个数组,一个是链表。
面试官:对,是这样,那你有想过为什么数组查找比链表块吗?
我:额。忘记了,好像数据结构上有讲过(其实是数组的地址是连续的,链表的地址是不连续的)
面试官:你看,你好像没怎么准备啊,了解过HashMap吗?
我:了解一点。
面试官:讲讲看怎么实现的HashMap。
我:HashMap是以键值对的形式存储对象的。在得到对象的Key时,用过hash函数把key和value都存放到数组中,如果遇到相同的hash值,则使用链地址法。数据结构是数组+链表的形式,在JAVA1.8中新增加了红黑树结构,在链表长度大于8的时候就会转成红黑树,因为红黑数的查找时间复杂度为O(lgN)。
面试官:知道几种解决hash碰撞的方法?
我:链地址,开地址法,二次哈希法。
面试官:知道为什么hashmap的数组长度要为2的幂吗?
我:额。不知道(其实在hashmap的使用长度超过负载因子时,hashmap会自动扩容。由于hash值太大不能拿来直接散列,所以要用hash值对数组长度取余操作,进一步放到数组下标里。数组下标的计算方法是“ (n - 1) & hash ”。即hash%length,“取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是2的幂次方。)
面试官:那看来你对基础掌握还不熟悉,希望你能再多学习学习,那我们今天的面试就结束了,你有什么想要问我的吗?
我:没。
1轮面试:电话面试
面试感受:一般;面试难度:非常困难;面试来源:内部推荐
共1个问题,1条回答
Q:讲讲看怎么实现的HashMap