第一次面试(java)
记录我的第一次面试(失败)
感觉自己非常沙比。
这次面试难度不高,但是由于第一次面试特别紧张为了等电话一天没吃饭 。面试的时候头晕脑涨。
其次最近半年都在写go,这次面试主面java忘了好多。
开始
面试官:先问点基础吧,hashmap和hashtable的区别是什么。
我:hashmap可以存null键值hashtable不行。
面试官:还有呢?
我:emmmmmmm(我写java的时候从不用hashtable)。
这里的答案是hashtable带锁hashmap不带。
面试官:并发情况下为了安全这两你用那个?
我:emmmm,都不用我用currenthashmap(因为上面那个不知道所以这里并不是面试官期待的答案)
面试官:什么情况下hashmap会链表转红黑树,这么做的好处是什么?为什么一定要用红黑树?
我:链表长度大于8的时候会转红黑树。之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。而红黑树在插入新数据后可能需要通过左旋,右旋、变色这些操作来保持平衡,引入红黑树就是为了查找数据快,解决链表查询深度的问题,我们知道红黑树属于平衡二叉树,但是为了保持“平衡”是需要付出代价的,但是该代价所损耗的资源要比遍历线性链表要少,所以当长度大于8的时候,会使用红黑树,如果链表长度很短的话,根本不需要引入红黑树,引入反而会慢。好处是查找快,因为红黑树查找长度为log(n)。
面试官:了解B+树吗?
我:(露出微笑最近看了不少数据库原理,我带着索引一起说了吧,巴拉巴拉~~~~
面试官:说说JVM内存模型吧
我:1.7巴拉巴拉~~1.8没了永久带巴拉巴拉~~
面试官:描述一下tcp三次握手的过程吧
我:巴拉巴拉~~并且每次还带了一个序列号它是这样变化的,举个例子巴拉巴拉~
面试官:为什么是三次不是两次或者四次?
我:(我看你是在难为我小叮当),这个我觉得是因为两次的时候只有服务端准备好了连接资源,第三次客户端才会连接资源它们才能连得上。(这不是他期望的答案)
面试官:你在想想
我:emmmmmm,我想不到了(其实他想听的应该是,之前有链接因为网络卡主了,现在才过来,如果是两次握手的话,这过来就连上了,找错人了啊)。
面试官:为什么不是四次呢?不是刁难你哈,惯例就这么问
我:emmmmmm(三次都连好了,你还四次搞毛线呢,我看你就是刁难我),这个我没想过~~~~。(其实老老实实说出来就好了,三次以及握手完毕了就算在握也是重复之前的步骤没什么意义。)
面试官:说一下四次挥手吧
我:巴拉巴拉~~~
面试官:说说https的过程吧
我:巴拉巴拉~~~(但是忘了说根证书验证证书合法性)
面试官:用过线程池吗?能简单描述一下Java如何创建吗?
我:emmmm。(好久没写Java了那四个函数名给忘了),如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务。其次如果不做限制无限创建线程可能导致内存溢出呢。
面试官:说具体怎么创建?
我:emmmm,好久没写了,只记得有四种创建方式,其中一个是单池,还有可以创建定长的池,具体函数忘了。go里面我们一般用通道来限制goroutine。
面试官:说说乐观锁悲观锁
我:悲观锁,就是数据一定会被改所以要阻塞线程synchronized和ReentrantLock是悲观锁,乐观锁就是总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。cas就是乐观锁的实现
面试官:cas的aba问题Java怎么解决?
我:emmmmm(记得有两个原子操作类可以解决,好像原理是加了版本戳),这个我记不清楚了呢?但是go这边我们是原子 操作的cas呢,不存在这个问题呢
面试官:我看你这里写了zookeeper,你在项目里用过吗?
我:没有,只是为了练习分布式锁的实现在虚拟机上搭的玩。
面试官:那你描述一下zookeeper实现分布式锁的过程吧
我:1.客户端连接zp,并在/lock下创建临时的且有序的子节点,第一个客户端对应的子节点为/lock/lock-00000000,后面的依次+1
2.客户端获取/lock下的子节点列表,判断自己创建的子节点是否为当前列表中序号最小的子节点,如果是则认为获得锁,否则监听刚好比自己序号小的节点删除消息,获得子节点变更通知后重复此步骤直到获得锁。(这里当时说的不太清楚)。
3.执行业务代码
4.删除对应的子节点就是释放锁。
面试官:聊聊项目吧,说说你的第一个项目
我:这是一个挺简单的微信小程序,后端是我一个人实现的。巴拉巴拉~~~~~
面试官:聊聊第二个吧,说说你这sql-plan怎么分析的
我:巴拉巴拉~,我分析了四中种,但应该还有一种我并没有分析出来。
面试官:看来你还是比较喜欢go啊
我:^_^
面试官:公司现在是主写Java呢,你对语言有什么特殊倾向吗?
我:没有,后端程序员不挑语言。
面试官:说说go和Java的不同吧
我:go更好写并发,网络天生epoll,不担心伪共享,但是没有泛型,占用内存少。java庞大丰富的生态,大数据,庞大的使用群体。其次java的垃圾回收比go好。
面试官:现在公司的产品有巴拉巴拉~~~主要还是以java为主~~~~ssm简单搭了一套~~~以后会怎么样巴拉巴拉~~~~~
我:O(∩_∩)O~
面试官:一直都是我问你你也问问我吧
我:以后会使用云原生相关的东西吗?
面试官:目前并发不大,以后应该会先做微服务巴拉巴拉~~~
还有什么想问的吗?
我:没有了。
面试官:好的,那么这次面试就结束了,请等待hr的消息。
我:好的,再见
总结:面的一般,有时候没有get到面试官想听的点。说了大半年没写Java的事。Java的很多函数说不上具体的名,忘了很多。从早上到下午5点来电话没吃饭,面的时候有点晕,说话都没思考,全凭本能。第一次面试特别紧张,有些语无伦次,面完之后嘴唇发白,感觉很累。本来准备给面试官说说tidb源码装装B,但是他一点没问。整个过程很被动。全程大概40分钟。
ps:这一篇很早就在git上写完了,想起来好久没有好好运营一下简书了,做一个简单的搬运~。