小小作为一个非著名博主,于近日跑路,一份面试题即将呈现。

跑路场景

跑路分为两个部分,分别是离京,和被迫进京。

离京


离京当天是半夜了,在半夜的时候到达自己的老窝。这是一条相当漫长的路。

进京

令人忧伤的是,进北京的时候,也是这样,做在了第二节车厢。小小望着窗外黑洞洞的一切,相当的无语。

回家

这是小小家门前的大楼。

拍照技术尚可,不过一般般。

总结

怀着忧伤的心情,在家呆了三天,垂头丧气的跑了回来。

面试现场

面试官: 听说你上次还差一点点,再看数才及格,但是我感觉你表现还是可以的,这次破例再来面试一遍。
小小:大多数人还是比较喜欢看再看的,相当感谢面试官给予一次再次面试的机会。
面试官: 谈一谈你对Java面向对象的理解。
小小:面向对象的核心是封装,继承,多态。
面试官: 继续深入
小小: 封装是把现实对象封装成为一个JavaBean。继承是使用extends关键字,对另外一个对象的属性和方法进行继承。多态是,设计一个接口,有多个实现这个接口的方法。
面试官: 你是不是忘了一个?是不是还有一个抽象。
小小: 嗯嗯,是的,还有一个抽象。抽象是把一堆类的公有的属性和方法抽取出来,作为抽象类的一部分。
面试官: Java集合你用过吗?
小小:Java集合用过,小小常用的List集合和Map集合。List集合前面定义的接口是List,Map集合前面的接口是Map。List集合底层是数组和链表,Map集合是使用Key和Value。
面试官: HashMap你用过吗?
小小:HashMap用过,这里简单使用了一下HashMap
面试官: HashMap底层是什么?
小小: HashMap底层是一种数组+链表的数据结构,在put操作中,通过内部定义算法寻找到指定的下标,把数据放入数据元素中,若通过算法发现已有元素已在该元素中有元素,此时会产生hash冲突,链表的产生的意义在于解决掉hash冲突。

面试官: 讲一下hashMap的数据结构吧
小小: HashMap有三种数据结构,分别是数组,链表,哈希表。对于数组来说, 数组存储区间是连续的,占用内存严重,故空间复杂度大。但数组的二分查找时间复杂度小,为O(1);数组特点:寻址容易,插入和删除困难;链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表特点:寻址困难,插入和删除容易。哈希表那么我们综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构,这就是哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内存空间,使用也十分方便。哈希表有多种不同的实现方法,HashMap则使用的是拉链法,也叫作【链地址法】;


哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中:

 12%16=12,28%16=12,108%16=12,140%16=12

所以12、28、108以及140都存储在数组下标为12的位置。

面试官: HashMap源码你看过吗?
小小: 没有,一脸无辜(o´・ェ・`o)
面试官,滚!回家。

第二发面试

鉴于你的点赞数不错,这次嘛,作为资深的HR,本HR再次破例让你第二发面试。
面试官:上一次不是说到了HashMap,HashMap源码你看了没?
小小:我!看啦。(骄傲的举起双手)
面试官: 你既然已经看过源码了,那我问你,HashMap线程安全吗?
小小:安全!
面试官:(阴沉着脸)你到底看了没,
小小:(委屈状)我看了。。。。。。
面试官:好吧,你回家百度一下,HashMap到底线程安全不安全。

第三发面试

鉴于你阅读量,和联合出版社送书的活动都不错,所以呢,所以破例破例破例给你最后最后最后一次面试。
面试官:上一次说了,HashMap线程安全吗?
小小:不安全。
面试官:(心里想)猜你回家也没看,我也不问那么仔细了。
面试官:JVM你了解过吗?
小小: JVM是一种运行在操作系统之上的,可以实现跨平台的运行。
面试官:JVM内存划分讲一下吧。
小小: 我。。。。w(゚Д゚)w
小小: 在桌子底下偷偷摸摸的拿出手机,谷歌一下: JVM的内存。眼睛瞟着手机,
小小: 继续说道:JVM内存分为堆内存,方法区和栈三大部分,堆内存是最大的一部分,分为老年代和新生代,两大部分组成。年轻代内存被划分为三个部分分别为Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配。
面试官:我瞄的,早都看见你桌子底下的手机了,别以为我不知道你干啥了。面试官心里想。
面试官: 我继续问你,Java双亲委派机制你知道吗?
小小:我。。。。只知道classLoader,和底层是C++编写。
面试官:唉,扶不起来的阿斗,你回家了。

最后一发

小小继续坚持不懈,苦刷面试题,终于经过再三的投递简历,又一次的面试上了这家企业。
面试官:什么是双亲委派呢?(我猜你回家没有看)
小小,切,这次本小小回家可看了,这就听我慢慢说来。
小小:
一个类的加载需要由其父类进行加载(够专业不!)所有的线程都有上下文,通过上下文的方式进行加载。(够牛逼不!)
面试官:没听懂。过
面试官: 数据库你用过哪些?
小小: 数据库用过MySql,等一些。
面试官:MySql索引你了解吗?
小小:了解,数据库中的MySql中的索引用的是B+树,通过树的数据结构的方式实现。

面试官:Spring 用过吗?
小小:用过
面试官: 最核心的是什么?
小小:IOC和AOP
面试,那就介绍一下IOC和AOP
小小:IOC是有一个容器,把原先new的过程由程序员代new变成容器代new。AOP是通过注解,实现依赖注入。
面试官:MyBatis用过吧,源码,看过吧。
小小: 看过
面试官: 问你个问题,MyBatis接口函数可以随意重载吗?
小小: 不可以随意重载,因为mybatis里面将接口里面的方法名称和配置文件里面的id属性进行唯一配对,在同一个命名空间下只能有一个id,那么所有函数名称相同的重载函数都会被绑定到一个id上,所以,如果要实现函数的重载,必须让一个SQL语句去适应多个函数的参数,如果是单纯的重载是肯定不行的(重载函数的定义就是参数相关),但是得益于mybatis的多种传参方式和隐性的分页功能,可以在接口里面进行函数重载,但是还是需要将所有的重载函数适配到同一个id的SQL上面去,仍然有很大的局限性,并不是可以随意的进行重载。

核心在于,如果重载会导致出现一对多的情况。

送书

小小本周送书啦。这次送的书是Java深度调试技术。

参与抽奖方式

老规矩,从留言区中选中奖者,按照点赞数选择,点赞数高着或者书,本次送书一本。

送的书籍

本次送的书为